最近在看阮一峰老师的ECMAScript 6 入门这本书,随手做一下读书笔记
ECMAScript 6 入门 这是原文链接
感谢阮老师开源,不过我还是买了纸质版。
下面就是我的笔记
1、let
let 声明变量用,块级作用域。let不存在变量提升,以前用var的时候,变量可以在声明前就可以使用(预执行阶段就为变量赋值为undefine,具体原因可以去看看js的执行机制),而用let声明变量,变量一定要在声明后才可以使用,不然就会报错。
以下为例子
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;
暂时性死区
直接上例子
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。
总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
例子:
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
2、const
const声明一个只读的常量。一旦声明,常量的值就不能改变。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
const声明后要立刻赋值,不立刻赋值会报错。
const foo;
// SyntaxError: Missing initializer in const declaration
const 同样存在暂时性死区
值引用类型数据定义
对于引用类型的变量,const只是规定地址不能变,而里面的值是能够改变的
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only