let 和 const 关键字
看了阮老师的ES6入门再加上自己的一些理解整理出的学习笔记
let关键字
- 跟var相比,不会提升为全局变量,始终是块级作用域{}
- 注意点:
- 1: 不能在同一个块级作用域内声明同名变量
- 2: (如果当前块级作用域内{}内部没有该变量的声明)向上级作用域查找,如果有声明,就只在本块级作用域中查找 let num = 1;if(true){console.log(num) //1}
- 3: 各个块级作用域内声明的变量是独立使用的,在更小的作用域内可以使用更大作用域的变量 let num =1 ; if(true){ let num = 2;//2 } //1
const关键字
- const声明一个只读的常量,一旦声明,常量的值就不能改变。
- 也是块级作用域,不存在变量类型提升
- const不仅不允许不声明直接使用,而且必须一次性完成初始化(声明+赋值)
- 同一个块级作用域内不允许声明同名的常量
- 不允许被二次赋值,而可以被挂载属性
引用阮老师写在《ECMAScript 6 入门》中的一段话:
const
实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const
只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。const foo = {}; // 为 foo 添加一个属性,可以成功 foo.prop = 123; foo.prop // 123 // 将 foo 指向另一个对象,就会报错 foo = {}; // TypeError: "foo" is read-only上面代码中,常量
foo
储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo
指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。
小总结:
- 不管是let还是const ,都是块级作用域,都必须至少是先声明,才能使用(严格模式)
- let 可以先声明,后赋值,const必须一次完成
- 两者都不允许在同一个块级作用域内声明同名
最后附上书籍地址:http://es6.ruanyifeng.com/
感谢观看!