第一章 let与const
1.ECMAScript 6.0的简称 ES6
2.ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现
3.ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等
4.let和var相似,但let只在代码块中有效
5.let不存在变量提升:var命令会发生“变量提升”现象,即变量可以在声明之前使用。
为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错
6.let暂时性死区:只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。只能在声明的位置后使用。
7.在没有let之前,typeof运算符是百分之百安全的,永远不会报错。现在这一点不成立了。这样的设计是为了让大家养成良好的编程习惯,变量一定要在声明之后使用,否则就报错
8.let不允许重复声明:let不允许在相同作用域内,重复声明同一个变量,否则会报错。
9.块级作用域解决问题:①内层变量覆盖外层变量 ②用来计数的循环变量泄露为全局变量
10.块级作用域的特点:①可以任意嵌套 ②内层作用域变量可以与外层作用域变量同名,互不影响③ES6 的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域
11.const是一个只读常量,一点定义,常量的值就不能改变。特点:①一旦声明马上赋值②const的作用域与let命令相同:只在声明所在的块级作用域内有效③暂时性死区:只能在声明的位置后使用。④不允许重复声明
12.ES6声明变量的方式有6种:原有两个var,function,新增四个let,const,import,class(后边两个以后会总结)
13.var,function命令声明的全局变量依然是顶层对象(可使用window.name访问),新增的let,const,class声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
14.JavaScript 语言存在一个顶层对象,它提供全局环境(即全局作用域),所有代码都是在这个环境中运行。但是,顶层对象在各种实现里面是不统一的。
浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window。
浏览器和 Web Worker 里面,self也指向顶层对象,但是 Node 没有self。
Node 里面,顶层对象是global,但其他环境都不支持。