ES6 let & const
- let与var的区别
var | let |
---|---|
存在变量提升 | 不存在变量提升 |
可以重复赋值 | 不可以重复赋值 |
全局变量会作为window的属性 | 全局变量不会作为window的属性 |
作用域:全局,局部(函数内) | 作用域:全局,块级作用域({}一个大括号为一个代码块) |
//1.没有变量声明提升
console.log(num)//undefined
var num=10;
console.log(a);//报错 为:初始化前无法访问a
let a=20;
从上面的代码中可以看出,var 即使定义在输出的后面的,也不会报错,只会返回undefined,这里大致说一下var变量的声明提升
在预编译阶段,编译器会把所有var定义的变量全部提升到当前作用域的最顶部,但上去的只是定义,赋值还是在下方,所以会出现undefined。
而let没有变量提升,所以会直接报错
报错内容:Cannot access ‘a’ before initialization
翻译为:初始化前无法访问“a”
//2.不能重复赋值
var sum=100;
var sum=200;
console.log(sum)//200
let sum1=100;
let sum1=200;
console.log(sum1)//报错
从上面的代码中可以看出,var支持重新赋值,上面的值会被下面的值所覆盖
而let如果从新赋值的话就会报错
报错内容为:Identifier ‘sum1’ has already been declared
翻译为:已声明标识符“sum1”
所以 let在同一作用域中是不能重新赋值的
//3.全局变量不作为window的属性,不存放在window下
var w=10;
console.log(window.w);//10
let w1=10;
console.log(window.w1)//undefined
从上面的代码中可以看出,let的全局变量是不会作为window的属性的。
//4.块级作用域
function num() {
var n = 10;
if (true) {
var n = 5
}
console.log(n)
}
num()
function num1() {
let n = 10;
if (true) {
let n = 5
}
console.log(n)
}
num1()
从上面的代码中可以看出,var 存在变量提升。所以,外层的代码块会收到内层代码块的影响。输出5
而let 的每层{}都是一个代码块,都是不同的块作用域,所以,外层的代码块不会收到内层代码块的影响。输出10
内层的作用域可以定义外层作用域的同名变量
//5.暂时性死区
var a=10;
function num(){
console.log(a);//报错
let a;
}
num();
只要块级作用域中存在let命令,let所声明的变量就绑定这个作用域,不在受外部的影响
ES6中明文规定,如果区块中存在let或const命令,这些区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)
- const
ES6中const用来声明一个只读的常量,用const声明的变量是不能在进行赋值的。这就意味着,const一旦声明常量,就必须立即初始化,不能留到以后赋值。
//const
const a=5;
a=10;//报错
但const只是不允许=的赋值,但我们可以用对象来进行赋值操作
因为const它锁定的只是对象在栈上的地址,但我们可以去堆中把值改变。
//const
const p={}
p.name='xiaoming'
p.name='xiaohua'
console.log(p.name)