相同点
- 只在声明所在的块级作用域内有效。
- 不提升,同时存在暂时性死区,只能在声明的位置后面使用。
- 不可重复声明。
不同点
-
let声明的变量可以改变,值和类型都可以改变;const声明的常量不可以改变,这意味着,const一旦声明,就必须立即初始化,不能以后再赋值。
const i ; // 报错,一旦声明,就必须立即初始化 const j = 5; j = 10; // 报错,常量不可以改变
-
数组和对象等复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const只保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个复合类型的变量声明为常量必须非常小心。
const arr = []; arr = [1,2,3]; // 报错,[1,2,3]与[]不是同一个地址 const arr = []; arr[0] = 1; arr[1] = 2; arr[2] = 3; console.log(arr.length); // 输出:3 // 不报错,变量名arr指向的地址不变,只是数据改变
若想让定义的对象或数组的数据也不能改变,可以使用object.freeze(arr)进行冻结。冻结指的是不能向这个对象或数组添加新的属性,不能修改已有属性的值,不能删除已有属性。
const arr = []; //这里用let也可被冻结
Object.freeze(arr);
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
console.log(arr.length); // 输出:0
// 不报错,但数据改变无效