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/

感谢观看!

原文地址:https://www.cnblogs.com/bfc0517/p/6697689.html