一、ES6深入理解之 let、const
1. let
- let声明的变量只在块级作用域内有效
- let声明的变量不存在变量提升
console.log(a) //undefined
var a = 10;
console.log(b) //报错ReferenceError
let b = 1;
//var声明的变量可以变量提升,在console时a还没有赋值但已经存在,所以输出undefined
//let声明的变量不可以变量提升,在声明之前这个变量是不可以用的,输出会抛出一个错误
- 暂时性死区
var tmp = 123;
if (true) {
tmp = 'abc'; // 报错ReferenceError
let tmp;
}
//在if这个代码块内,let声明变量之前变量是不可以用的,称为暂时性死区
//在暂时性死区内 typeof 并不是一个百分百安全的操作
typeof(n) //报错ReferenceError
let n;
//因为在声明 n 之前 n 是不存在的
typeof(num) //undefined
//也就表明,在没有 let 之前 typeof 是百分百安全的
- 暂时性死区的本质,其实就是当进入这个作用域,变量是存在的,但是在 let 声明之前是不可以使用的
- 不允许重复声明,let 不允许在相同的作用域中重复声明
2. const
- const 声明只读的常量,一旦声明不能更改
- const声明的变量不能改变值,也就是在生命的时候必须马上初始化,不能后续赋值,只声明不初始化就会报错
- const 与 let 相同,只在声明所在的块级作用域内有效
- const 声明的变量不能变量提升,存在暂时性死区
- const 本质并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动,基本数据类型,值就存在变量所指向的内存空间,像引用数据类型,变量指向的内存空间保存的是地址,所以引用数据类型保证的就是保存的地址不变,但是地址指向的内容不保证
const foo = {};
foo.prop = 123; //给 foo 添加一个属性可以成功
foo = {} //但是更新 foo 就会报错
//数组也相同
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['lle']; // 报错
- 如果真的想将对象冻结,那么可以使用 Object.freeze 方法
const foo = Object.freeze({})
//此时 foo 既不可以添加属性,也不可以改变
== let、const声明的变量不属于window ==