一. let命令
(1)不存在「变量提升」
var命令存在「变量提升」。
console.log(a); // undefined
var a = 1;
上面代码等价于
var a;
console.log(a); // undefined
a = 1;
如果使用let
console.log(a); // a is not defined
let a = 1;
(2)暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
总结:「就是在块级作用域内,使用let命令声明变量前,该变量不可使用」。
二. const命令
「const」命令声明一个只读的常量。
本质:
「const」实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
对于「简单数据类型」(Number,String,Boolean),值就保存在变量指向的那个内存地址,因此等同于常量。
而对于「复杂数据类型」(主要是指数组和对象),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。
比如:
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
网友评论