let,var,const比较
类型 | 是否变量提升 | 是否挂在window上 | 作用域 | 是否可以重复定义 | 是否可以多次赋值 |
---|---|---|---|---|---|
var | 是 | 是 | 只有函数作用域 | 可以 | 可以 |
let | 否 | 否 | 所有块级作用域 | 同一作用域内不可以定义同名变量,不同作用域内可以 | 可以 |
const | 否 | 否 | 所有块级作用域 | 同上 | 不可以,定义变量之后就不可再赋值 |
总结:
- var只有函数作用域,可以重复定义,赋值
- let和const是块级作用域,所有{}都是作用域,在{}内部定义的变量,外面访问不到,并且不同作用域之间可以定义同名变量
- 因为let,const不会变量提升,所以在调用他们之前必须先定义。eg:
a = 1; // 错误,因为没有变量提升,所以在调用它之前必须先定义
let a;
复制代码
- let,const他们是脱离window的,eg:
let a = '123';
window.a // undefined
复制代码
- const定义的变量一旦定义了就没办法改变其值,但是对于对象和数组这类引用变量,不可以改变指引的对象,但是其值可以改变。 eg:
const a = {};
a.name = 'BaoMax'; // 正确
a = { name: 'BaoMax' }; // 错误
const arr = [];
arr.push(1); // 正确
arr = [1]; // 错误
复制代码
如果想要引用对象的值可以使用:Object.freeze(obj)
Object.freeze(obj): MDN
入参:需要被冻结的对象 出参:被冻结的对象
方法可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象