1、严格模式与 ECMAScript 6
ECMAScript 5 引入严格模式来清理语言,在文件或者函数的第一行放入下面的内容就可以开启严格模式:'use strict'
;
严格模式引入了三种破坏性的改变:
语法改变:一些之前合法的语法在严格模式下面是不允许的。例如:
禁止 with 语句。它允许使用者添加任何对象到变量作用域链,这会减缓程序的执行速度,并且很难指出某个变量指向哪里。
删除一个独立的标识符(一个变量,而不是一个属性)是不允许的。
函数只能在作用域的顶层声明。
更多的保留字: implements interface let package private protected public static yield 。
更多种类的错误。例如:
给一个未声明的变量赋值会抛出 ReferenceError 。在非严格模式下,这样干就会创建一个全局变量。
修改只读的属性(比如字符串的长度属性)会抛出 TypeError 。在非严格模式下,不会产生任何效果。
不同的语义:在严格模式下,一些语法结构表现得不一样。例如:
arguments 不再随着当前参数值的改变而改变。
在非方法的函数中 this 是 undefined 。在非严格模式下,它指向全局对象( window ),也就是说如果调用一个构造器的时候没有使用 new ,就会创建一些全局变量。
严格模式是一个很好地说明了版本化是棘手的:即便能够制作一个干净版本的 JavaScript ,也很难被大家接受。主要原因是破坏了一些现存的代码,降低了执行速度,并且加入到文件中也很麻烦(更不用说交互的命令行)。
2、let和const命令
ES6 规定暂时性死区和let、const语句不出现变量提升(声明前可用),主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。
const、let不允许在相同作用域内,重复声明同一个变量。
const的作用域与let命令相同:只在声明所在的块级作用域内有效。
const 声明一个只读的常量。一旦声明,常量的值就不能改变。一旦声明变量,就必须立即初始化,不能留到以后赋值。
const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,(主要是对象和数组)所以将一个对象声明为常量必须非常小心。
3、解构赋值
数组的解构赋值
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3
let [ , , third] = ["foo", "bar", "baz"];
third // "baz"
字符串的解构赋值
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
对象的解构赋值
let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"
let { baz } = { foo: "aaa", bar: "bbb" };
baz // undefined
函数参数的解构赋值
[[1, 2], [3, 4]].map(([a, b]) => a + b);
// [ 3, 7 ]
用途:
交换变量的值
let x = 1;
let y = 2;
[x, y] = [y, x];
从函数返回多个值
// 返回一个数组
function example() {
return [1, 2, 3];
}
let [a, b, c] = example();
// 返回一个对象
function example() {
return {
foo: 1,
bar: 2
};
}
let { foo, bar } = example();
函数参数的定义
// 参数是一组有次序的值
function f([x, y, z]) { ... }
f([1, 2, 3]);
// 参数是一组无次序的值
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});
提取JSON数据
let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(id, status, number);
// 42, "OK", [867, 5309]
函数参数的默认值
const change = (a=1,b=2,c)=>{
var s = a?a:1 //避免出现
}
遍历Map结构
var map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
// 获取键值
for (let [,value] of map) {
console.log(value)
}
输入模块的指定方法
const { aa, bb } = require("cc");
圆括号问题:
变量声明语句中,不能带有圆括号。
函数参数中,模式不能带有圆括号。
赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中
总结:
如果解构不成功,变量的值就等于undefined。
不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。
解构赋值允许指定默认值。
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
默认值生效的条件是,对象的属性值严格等于undefined。
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。