1、var在声明所在的函数作用域内有效。 function(){}
let与const都是只在声明所在的块级作用域内有效。{}
2、var与let声明的变量可以改变,值和类型都可以改变,没有限制。
const
声明的常量不得改变值,这意味着,const一旦声明常量,就必须立即初始化,不能留到以后赋值,且不能重复赋值。
const a; // 报错,一旦声明变量,应该立即赋值!!const b = 10;b = 20; // 报错,因为定义常量之后不能重新赋值!!
3、对于复合类型的变量,如数组和对象,变量名不指向数据,而是指向数据所在的地址。
const
命令只是保证变量名指向的地址不变,并不保证该地址的数据不变。
const arr = [];arr = [1, 2, 3]; // 报错,因为变量arr指向的地址不能发生改变,应始终指向[]所在的地址!!![1,2,3]与[]不是同一个地址
下面这样就不会报错:
arr[0] = 1;arr[1] = 2;arr[2] = 3;
对象也是如此,示例如下:
const obj = { a: 1, b: 2}; obj = { // 报错 a: 3, b: 4}; obj.a = 3; // 不报错obj.b = 4; // 不报错
如果想让定义的对象或数组的内部数据也不能够修改和改变,可以使用Object.freeze(obj)进行冻结,这样为对象添加新属性就不起作用。
除了将对象本身冻结,对象的属性也应该冻结。
const obj = { a: 1, b: 2};obj.a = 9;console.log(obj); // {a: 9, b: 2}; obj.a 发生改变Object.freeze(obj); // 冻结obj.b = 99;console.log(obj); // {a: 9, b: 2}; obj.b 未发生改变
参考: