ES6学习系列文章----let、const

本系列文章参考阮一峰的[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命令声明的全局变量,不属于顶层对象的属性。

你可能感兴趣的:(ES6学习系列文章----let、const)