变量
- ES的变量是松散类型的,可以保存任何类型的数据
- 每个变量只不过是一个保存任意值的命名占位符
- 三个关键字,可以声明变量。let,const, var
- let, const 只能在es6 和之后版本使用
var关键字
- 不初始化的话,变量会保存一个undefined值
- var声明作用域:在一个函数内部定义一个变量,它的作用域就是这个函数。如果没有加var,就是全局变量,但是不推荐在函数局部作用域通过省略var来定义全局变量。
- 如果要定义多个变量,可以在一条语句中加逗号。
- var声明提升:把所有变量声明拉到函数作用域顶部。
- 可以重复声明一个变量。
- 全局作用域声明的变量是window对象的属性
let声明
- 作用域是块作用域
- 同一个作用域中,不可以重复声明一个变量。
- let 和var 混用,还是不可以重复声明一个变量。
- 不能变量提升。造成变量声明之前的代码执行叫做暂时性死区,如果引用了变量,就会报错。
- 全局作用域声明的变量不是window对象的属性
for循环
for(var i=0;i<5;++i){
setTimeout(()=>{
console.log(i)
},0)
- 输出的是5,5,5,5,5。因为在退出循环时,迭代变量保存的是导致循环退出的值。
for(let i=0;i<5;++i){
setTimeout(()=>{
console.log(i)
},0)
- 输出的是0,1,2,3,4。因为每次迭代声明一个独立变量,每个setTimeout引用的都是不同的变量。
const
- 声明时必须初始化
- 修改常量会报错
- 其他和let相同,比如不能重复声明,块作用域
- 不能在for循环中,作为迭代变量,因为迭代变量会变化。如下会报错
for(const i=0;i<5;++i){
setTimeout(()=>{
console.log(i)
},0)
- const可以声明一个不会被修改的循环变量。每次迭代会创建一个新变量。
for(const key in {a:1,b:2}){
}
for(const value of [1,2,3]){
}
//for in 主要用于遍历对象。for of主要用于遍历数组。
声明风格
- 尽量使用let和const,不要使用var
- 优先使用const,let次之:能够迅速发现因意外赋值导致的非预期行为