Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码。
1、let和const
JavaScript没有块级作用域。
let 定义的变量相对于var不同点:不能被提升; 可重复定义检查(避免在多人协作中,一个变量在同一个作用域被定义两次);能被用于块级作用域(循环的每一次执行都产生了一个作用域)
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
变量i是var声明的,在全局范围内都有效,所以全局只有一个变量i。
而如果使用let,声明的变量仅在块级作用域内有效,最后输出的是6。(这种解决冲突的方案,与立即执行函数传递参数,创建的块级作用域异曲同工之妙)
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
暂时性死区: 以上代码中tmp未定义。ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
另外要注意两点:
1、ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。
2、ES6 的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。
const: 原理:阻隔变量名所对应的内存地址被改变。const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
const声明的常量,也与let一样不可重复声明,不能提升,存在暂时性死区,只能在声明的位置后面使用。
不过内容仍然能够通过修改属性而被修改:
const fpp = {
a:1,
b:2
}
fpp.a=2 //2
ES5之中,顶层对象的属性与全局变量是等价的。ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
var a = 1;
window.a // 1
let b = 1;
window.b // undefined
2. 变量的结构赋值
ES6允许从数组和对象中提取值,按照对应位置进行赋值
let [a, b, c] = [1, 2, 3];
解构赋值允许指定默认值,但是如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x = 1] = [null]; x // null
对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
let { foo: baz } = { foo: "aaa", bar: "bbb" };
baz // "aaa"
foo // error: foo is not defined
foo只是匹配模式,真正被赋值的是baz变量。
圆括号问题:ES6的规则是,只要有可能导致解构的歧义,就不得使用圆括号。
1.变量声明不能使用圆括号:let {(x): c} = {}; //报错
2.函数参数中,模式不能带有圆括号:function f([(z)]) { return z; } //报错
3.赋值语句中,不能将整个模式放在圆括号中 ({ p: a }) = { p: 42 }; //报错
可以使用圆括号的情况:赋值语句的非模式部分。
[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确
它们都是赋值语句,而不是声明语句;其次它们的圆括号都不属于模式的一部分。
let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(id, status, number); //42, "OK", [867,5309]
2. 遍历Map结构
var map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
// first is hello
// second is world
3.字符串的扩展
码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,只要将码点放入大括号,就能正确解读该字符。
"\u{20BB7}" //"