JavaScript基本(一)
变量
js有三种申明变量的方式,var,let const
var关键字
var 申明的变量是一个函数作用域的变量,如果没事使用var定义变量,那么这个属性属于全局变量。可以使用widow访问这个变量。var关键字申明的变量会对变量进行提升。
function a() {
console.log("b:", b);
var b = 20;
}
等价于
function a() {
var b;
console.log("b:", b);
b = 20;
}
let 关键字
let 和var 作用差不多,不同的点是let是块作用域,而var申明的是函数作用域。
暂时性死区
let申明的变量不会在作用域中提升。 JavaScript引擎会注意出现在块后面let申明。只不够在此之前不能使用let所申明的变量。在let申明之前的瞬间称之为暂时性死区
全局申明
let在全局申明作用域申明的变量不能成为window对象的属性。而var在全局作用域中申明的变量可以作为window的属性
条件申明
var在处理多次重复申明的时候,会自动将多余的变量进行整合顶部成为一个变量。let在同一个作用域中不能重复申明相同的变量。在for循环中定义的迭代变量会渗透到循环外部。例如
for (var index = 0; index < array.length; index++) {
setTimeout(() => {
console.log(index)
}, 0);
}
等价于
var index
for (index = 0; index <5; index++) {
setTimeout(() => {
console.log(index)
}, 0);
}
上述例子导致输出的都是4,之所以会这样,是因为循环结束的时候保存的是推出的值,即index=4,所以输出的都是4
for (let index = 0; index < 5; index++) {
setTimeout(() => {
console.log(index)
}, 0);
}
上述例子输出的是0到4(0,1,2,3,4),使用let申明的变量,JavaScript引擎会为每个迭代的对象都申明一个对象,每个定时器都引用的不同的对象
const关键字
const申明和let基本一致,唯一不用的是const申明必须要初始化变量,且尝试修改const申明的变量会报错。const申明的变量只适用于它指向的变量引用。如果const修饰的变量如果是一个对象,那么修改其内部的数据和结构是不会出错
变量总结
优先使用const,其次使用let,最好不要使用var.ES6增加了let和const,从客观上来说可以使语言能够更加精确的使用其作用域和语义上能够更好的支持。const申明的变量可以上浏览器运行时候的地址保存不变,可以上静态代码分析工具能够提前发现不合法的赋值操作。也可以使得开发者有信心推断某些值是不变的。
数据类型
ES中有6中简单的类型,undefined、number、null、string、symbol和boolean.还有一种复杂的类型Object.Object类型是一种无序的数据类型。
typeof操作符
ES的类型是松散的,所以需要一种手段来确定其类型。typeof操作符就是来判断这些类型的。
- 1 undefined 表示未定义
- 2 boolean表示布尔值
- 3 string 表示字符串
- 4 number 表示字符串
- 5 object 表示为对象(而不是函数)或者null
- 6 function 表示为函数
- 7 symbol表示为符号
undefined
undefined表示未定义。let申明的变量,但是没有赋初始化值为undefined
Null
Null类型只有一个值,即null,Null类型使用typeof操作符得到的为object
Boolean
Boolean类型只有两个值true和false
Number
Number类型表示整数和浮点数。
NaN
有一个特殊的值Nan,字面意思是“不是数值”。NaN不等于包括NaN在内的任何值。可以使用isNaN函数来判断是否是NaN.如果参数是字符串,也会返回true
数值转换
有三个函数可以将非数值转换成数据,Number()、parseInt()、parseFolat()转换成数值。
Number可以把非字符串转换成字符串。但是如果参数是undefined的时候,返回NaN.Number在数值转换的时候有点复制和不合常规。如果转成整数,一般推荐使用parseInt()函数,parseInt()函数从第一个非空格字符串开始转换。如果第一个不是字符符号、加号、减号,parseInt()函数立即转成NaN.parseInt()函数支持两个参数,第一个参数表示要转换的数据,第二个表示进制。parseFloat()函数跟parseInt()函数类似,会把数据转化成浮点值
string类型
字符串是不可变的,一旦创建了,他们的值就不会变化。要修改某个变量中字符串,必须先销毁原始字符串,然后将包含新值的另外一个字符串保存到改变量中。
`