大家有可能想let和const有什么可以特意去了解的呢?它们不就是ES6新出的二种变量命名方式,确实如果,但是里面的坑你们还是需要了解的,很多人认为let是可以代替var的,嘿嘿,如果你们这样理解就大错特错了
let
let用来声明变量,并且会在当前作用域形成代码块
所谓代码块其实就是
{
let a=1
}
{}就是一个代码块.
使用let声明的变量,只能在当前代码块中访问,类似函数作用域。但是有不同的地方
- let声明的变量,变量是不会被提升的。这个和var有很大的区别的
function fn1() {
console.log(a);
let a = 2;
}
fn1(); // 报错
var b = 2;
function fn2() {
console.log(b);
let b = 1;
}
fn2(); // 报错
function fn3() {
console.log(a)
var a = 3
}
fn3() //undefined
var 会先将变量声明,但是并不赋值。所以是undefined
2. for循环中使用let定义变量,
let arr = []
for (let i = 0; i < 5; i++) {
arr.push(function() {
console.log(i)
})
}
arr[0]()//0
arr[1]()//1
arr[2]()//2
let arr = []
for (var i = 0; i < 5; i++) {
arr.push(function() {
console.log(i)
})
}
arr[0]()//5
arr[1]()//5
arr[2]()//5
而使用使用let/const关键字声明变量的for循环,除了会创建块级作用域,let/const还会将它绑定到每个循环中,确保对上个循环结束时候的值进行重新赋值
什么意思呢?简而言之就是每次循环都会声明一次(对比var声明的for循环只会声明一次),可以这么理解let/const中的for循环
const
const除了不能改变物理指针的特性,其他特性和let一样
当声明简单的数据类型,声明以后就不能改变
const a = 111
a = 2 //Assignment to constant variable.
当声明复杂数据类型的时候,物理指针不可改变,但是可以改变数据内的属性值,以及可以给数据添加新属性等操作
const obj = {
a: 2
}
obj.a = 3
obj.b = 1
console.log(obj) //{ a: 3, b: 1 }
obj = {} //Assignment to constant variable.