本系列文章参考阮一峰的[ECMAScript 6 入门](http://es6.ruanyifeng.com/)
添加了自己的理解与注释
let命令
1、只在let命令所在的代码块内有效
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.b // 1
用于 1、for循环 2、局部变量
2、不存在变量提升
console.log(foo); // 输出undefined
console.log(bar); // 报错ReferenceError
var foo = 2;
let bar = 2;
必须先定义后使用
3、暂时性死区
在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
// TDZ结束
let tmp;
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
4、不允许重复声明
// 报错
function () {
let a = 10;
var a = 1;
}
// 报错
function () {
let a = 10;
let a = 1;
}
// 报错
function () {
var a = 10;
let a = 1;
}
const命令
1、const声明一个只读的常量。一旦声明,常量的值就不能改变。
const PI = 3.1415;PI // 3.1415
PI = 3;// TypeError: Assignment to constant variable.
2、申明对象
const foo = {};
foo.prop = 123;
foo.prop// 123
foo = {}; // TypeError: "foo" is read-only
1、只能申明一次对象
2、可以给对象无限添加属性
3、声明数组
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错
1、只能申明一次数组
2、可以给数组无限添加值
4、冻结
const foo = Object.freeze({});
// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;
如果数组、对象也不想赋值的话可以执行freeze({})方法
下面是一个将对象彻底冻结的函数
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach(
(key, value) => {
//判断对象属性的值是否也有对象
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};
ES6的全局变量与顶层对象
1、var命令和function命令声明的全局变量,依旧是顶层对象的属性;
2、另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。