完整的ES6说明:ES6入门教程
let命令
let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效。- 'let’命令很适合在
for
循环中使用。 let
命令不进行变量提升。let
命令存在暂时性死区
。即在代码块内,使用let
命令声明变量之前,该变量都是不可用的。let
命令不允许重复声明变量。
块级作用域
-
ES6 允许块级作用域的任意嵌套。
-
内层作用域可以定义外层作用域的同名变量。
-
ES6 规定,块级作用域之中,函数声明语句的行为类似于
let
,在块级作用域之外不可引用。 -
在浏览器的ES6中,有如下特殊的处理方式:
- 允许在块级作用域内声明函数。
- 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
- 同时,函数声明还会提升到所在的块级作用域的头部。
上面三条规则只对 ES6 的浏览器实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作
let
处理。
考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。
const命令
const
的基本功能与其他语言大体一致。
const
的作用域与let
命令相同:只在声明所在的块级作用域内有效。const
命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。const
命令同样不允许重复声明变量。- 使用
const
命令去声明一个对象常量时需特别注意:const
只能保证变量所指的内存地址不发生改变,若一个对象被定义为const
,其对象本身是可以改变的,只是不能将其指向其他内存地址。 - 若要使对象本身也变得不可修改,应该使用
Object.freeze()
方法,括号内列写对象的属性,返回值为该对象。 Object.freeze()
类似于浅拷贝,对更深级别的对象只是引用,因此,若想进行彻底的冻结(类似于深拷贝),则可以调用如下函数:
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key, i) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};
顶层对象的属性
- 顶层对象,在浏览器环境指的是
window
对象,在Node
指的是global
对象。ES5 之中,顶层对象的属性与全局变量是等价的。 - ES6中,一方面规定,为了保持兼容性,
var
命令和function
命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let
命令、const
命令、class
命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。