1、let命令

(1)声明的变量,只在let命令所在的代码块内有效。

  • for循环的计数器,就很合适使用let命令。

(2)不存在变量提升

  • let声明的变量一定要在声明后使用,否则报错。

(3)暂时性死区

  • 在代码块内,使用let命令声明变量之前,该变量都是不可用的。
  • “暂时性死区”也意味着typeof不再是一个百分之百安全的操作。在声明之前,都属于x的“死区”,只要用到该变量就会报错。因此,typeof运行时就会抛出一个ReferenceError。在没有let之前,typeof运算符是百分之百安全的,永远不会报错。

(4)不允许重复声明

  • let不允许在相同作用域内,重复声明同一个变量。
  • 不能在函数内部重新声明参数

(5)块级作用域

  • 外层代码块不受内层代码块的影响,外层作用域无法读取内层作用域的变量,内层作用域可以定义外层作用域的同名变量。
  • 允许块级作用域的任意嵌套

(6)块级作用域与函数声明

  • 块级作用域之中,函数声明语句,在块级作用域之外不可引用。
  • 考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。

(7)do 表达式
本质上,块级作用域是一个语句,将多个操作封装在一起,没有返回值。在块级作用域之前加上do,使它变为do表达式,可以返回值。

2、const命令

(1)const声明的变量值不可变

(2)只声明不赋值,会报错

(3)const的作用域,只在声明所在的块级作用域内有效

(4)变量不提升,存在暂时性死区,应在声明的位置后面使用

(5)常量不可重复声明

(6)对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。