let和const

JavaScript 2020-07-23 950

记录自己关于《ES6标准入门》一书的阅读笔记、摘抄和理解。

let和const与var一样都是声明变量的命令,不同点在于let、const更为严格,也更加规范,适应于当下前端发展的需要。

1.let命令

声明变量,只能在let命令所在的代码块有效

{  
    let a = 10;  
    var b = 1;  
}  
a // ReferenceError:a is not defined  
b // 1  
1.2不存在变量提升

所谓变量提升,就是变量可以在声明之前使用,值undefined。如使用var就会存在变量提升。

// var  
console.log(foo) // underfined

// let  
console.log(bar) // ReferenceError  
let bar = 2;  
1.3暂时性死区

只要块级作用域存在let命令,它所声明的变量就绑定了这个区域,不在受外部的影响。

var tmp = 123;  
if (true){  
    tmp = 'abc'; // ReferenceError  
    let tmp;  
}  

上面的代码中存在全局变量tmp,但块级作用域内let又声明了一个局部变量tmp,后者绑定了这个块级作用域。
ES6明确规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成了封闭的作用域。只要在声明前使用这些变量,就报错。

1.4不允许重复声明

let不允许在相同作用域重复声明同一个变量。

// 报错  
if (true){  
    let a = 10;  
    var a = 1;  
}  

2.const命令

const声明一个只读的常量。一旦声明,常量的值就不能改变。
只在声明所在的块级作用域有效。不能重复声明,存在暂时性死区。
本质:
const实际上保证的并不是变量的值不得改变,而是变量指向的内存地址不能改变。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的内存地址中,因此等同于变量。但对于复合类型的数据(主要是对象和数组)而言,变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,无法控制。因此,将一个对象声明为常量必须非常小心。
如果希望将对象冻结(即无法修改对象,对于对象的操作都无效),应该使用Object.freeze方法

const foo = Object.freeze({});  
foo.prop = 123;  
// foo = {}  
顶层对象属性

顶层对象在浏览器环境中指的是window对象,而在node中是global对象。
ES5中,顶层对象的属性与全局变量的赋值是同一回事。
ES6中,var命令和function命令声明的全局变量依旧是顶层对象属性;另一方面,let命令,const命令,class命令声明的全局变量不属于顶层对象的属性。

标签:JavaScript

文章评论

评论列表

已有0条评论