es6
默认值赋值注意点:
1.只有当一个数组成员严格等于undefined,默认值才会生效。
let [x = 1] = [undefined]; x // 1 let [x = 1] = [null]; x // null
2.默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
let [x = 1, y = x] = []; // x=1; y=1 let [x = 1, y = x] = [2]; // x=2; y=2 let [x = 1, y = x] = [1, 2]; // x=1; y=2 let [x = y, y = 1] = []; // ReferenceError: y is not defined
变量的解构注意点
1.由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
let arr = [1, 2, 3]; let {0 : first, [arr.length - 1] : last} = arr; first // 1 last // 3
2.解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
let { prop: x } = undefined; // TypeError let { prop: y } = null; // TypeError
3.为了区分模式,还是表达式 --> 只要有可能导致解构的歧义,就不得使用圆括号。
//变量申明 let [(a)] = [1]; let {x: (c)} = {}; // 函数参数 function f([(z)]) { return z; } function f([z,(x)]) { return x; } //赋值语句的模式部分 ({ p: a }) = { p: 42 }; ([a]) = [5]; //可以使用(赋值语句的非模式部分) [(b)] = [3]; // 正确 ({ p: (d) } = {}); // 正确 [(parseInt.prop)] = [3]; // 正确
字符串拓展
详见http://es6.ruanyifeng.com/#docs/string
正则拓展
详见 http://es6.ruanyifeng.com/#docs/regex
数值的拓展
二进制和八进制表示法(前缀0b | 0o)
Number.isFinite(), Number.isNaN()
Number.parseInt(), Number.parseFloat()
Number.isInteger()
Number.EPSILON(最小精度) 2 ** -52
安全整数和 Number.isSafeInteger(): 判断是否在安全值范围
Math 对象的扩展
指数运算符**
函数的扩展
-
函数参数的默认值
-
rest 参数 …props
-
严格模式
-
name 属性
- 箭头函数 =>this引用的外层函数
Set 和 Map 数据结构
- Set: 它类似于数组,但是成员的值都是唯一的,没有重复的值。
-
const set = new Set([1, 2, 3, 4, 4, 4, 4]); [...set] // [1, 2, 3, 4] // 去除数组的重复成员 [...new Set(array)] //在 Set 内部,两个NaN是相等。 //另外,两个对象总是不相等的。
- add(value):添加某个值,返回 Set 结构本身。 - delete(value):删除某个值,返回一个布尔值,表示删除是否成功。 - has(value):返回一个布尔值,表示该值是否为Set的成员。 - clear():清除所有成员,没有返回值。
Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。
const map = new Map(); const k1 = ['a']; const k2 = ['a']; map .set(k1, 111) .set(k2, 222); map.get(k1) // 111 map.get(k2) // 222