什么是const和let
我们都知道使用const修饰会有一下作用。
1、描述
此声明创建一个常量,其作用域可以是全局或本地声明的块。与var变量不同,全局常量不会变为 window 对象的属性。需要一个常数的初始化器;也就是说,您必须在声明的同一语句中指定它的值(这是有道理的,因为以后不能更改)。
const 声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。例如,在引用内容是对象的情况下,这意味着可以改变对象的内容(例如,其参数)。
这就希望大家了解一下什么是“暂存死区”。
暂时性死区
从一个代码块的开始直到代码执行到声明变量的行之前,let 或 const 声明的变量都处于“暂时性死区”(Temporal dead zone,TDZ)中。
当变量处于暂时性死区之中时,其尚未被初始化,尝试访问变量将抛出 ReferenceError。当代码执行到声明变量所在的行时,变量被初始化为一个值。如果声明中未指定初始值,则变量将被初始化为 undefined。
{ // TDZ starts at beginning of scope
console.log(bar); // undefined
console.log(foo); // ReferenceError
var bar = 1;
let foo = 2; // End of TDZ (for foo)
}
这样看来它的好处就显而易见了
- 常量:变量命名的同时必须要付一个初始值,这样就规范了常量的数据类型,避免意义模糊的数字出现。
- 作用域:const命名的变量不存在 变量提升的问题,同时有自己的扩及作用域,不会提升到全局作用域,这样就防止了数据污染。
- 数组对象:首先再说数组和对象的时候,我们要明确一点,const定义的对象无法修改的内容是,对象名称无法修改,但是里面的key和value是可以修改和添加的,只是我们无法修改 比如:下面的代码块。这样的好处就防止了我们书写导致对象被重写的忧患,防止被意外修改,增强了程序的健壮性。
- 提高了程序的运行效率。编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,使得它成为一个编译期间的常量,没有了存储和读内存操作,使得它的运行效率也很高。
第三问的代码 比如:
const MY_OBJECT = {'key': 'value'};
// 重写对象和上面一样会失败
// Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {'OTHER_KEY': 'value'};
// 对象属性并不在保护的范围内
// 下面这个声明会成功执行
MY_OBJECT.key = 'otherValue'; // Use Object.freeze() to make object immutable
// 也可以用来定义数组
const MY_ARRAY = [];
// 可以向数组填充数据
MY_ARRAY.push('A'); // ["A"]
// 但是,将一个新数组赋给变量会引发错误
// Uncaught TypeError: Assignment to constant variable.
MY_ARRAY = ['B'];
总结:反正以后的项目内容建议大家都要使用const,尽量不要使用var,var使用let进行替换,非必要条件下不使用var。 这是const和let的官网MDN介绍是比较官方的内容,建议大家有时间仔细读一读真的很不错。