1、let声明变量只在块级作用域内有效
let在循环内使用时,只在当前轮循环有效,所以每一次都是一个新变量,循环出去后循环内的i会显示为未定义,所以会打印6
用var定义只会打印一次abc
用let定义会打印三次
证明了let定义的变量,每次循环都是一次新的变量
2、let声明变量在块级作用域内会形成暂时性死区
在块级作用域中,声明变量之前的区域就是暂时性死区
“暂时性死区”也意味着typeof不再是一个百分之百安全的操作。
声明变量反而会报错,不声明反而不会报错
3、let不允许在相同的作用域内重复声明同一个变量
4、变量提升(没有块级作用域)
因为if块内的变量提升了,所以打印的是undefined,愿意是想让if作用域外的tmp打印全局定义的时间
所以ES6有了块级作用域
如果用var定义会打印10
(每个花括号{}内都是一个块级作用域,ES6允许块级作用域的随意嵌套)
5、const声明常量,一旦声明不能被改变,意味着会立即初始化,其他属性和let相同
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址,const命令只是保证变量名指向的地址不变,并不保证改地址的数据不变
上面的代码中,常量foo储存的是一个地址,指向一个对象,不变的是这个地址,不能把foo指向另一个地址,但对象本身是可变的,所以可以向对象添加新的属性
原文:https://www.cnblogs.com/snly/p/9143429.html