注:这是一篇学习笔记,记录自己在ES6学习过程中按照自己的思路觉得应该记录的一些要点,方便以后查看和复习。参考:
阮一峰ES6的书籍中数组的扩展
我的ES6入门学习规划
广义的扩展运算符
可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。(译者注: 字面量一般指 [1, 2, 3] 或者 {name: “mdn”} 这种简洁的构造方式)
扩展运算符在对象字面量中的使用,将在对象的扩展中记录。本次仅包含数组的扩展运算符。
数组的扩展运算符
作用于实现了Iterator接口的数据(数组等),把数据转化为逗号分隔的参数序列。主要应用于函数调用,可以与其它参数混用;还可应用于数组解构、字面量形式创建数组中;后面可以接表达式,但是应用于解构时,后面不能接表达式;如果位于括号中,则括号必须是函数调用的括号,否则报错。
特性:
- 作用对象不仅仅是数组,包括所有实现了Iterator接口的数据;
- 如果值不是对象,先转为对象,再检查是否实现了Iterator接口;
- null、undefined值无法使用扩展运算符;
- number、boolean值,会先转为Number、Boolean对象,如果Number、Boolean类实现了Iterator接口,那么number、boolean值也能使用扩展运算符;
- 如果对象未实现iterator接口,而使用扩展运算符,则会报错;
- NodeList以及arguments对象都是已经实现了Iterator接口的数据;
应用:
- 函数调用,数组转为函数参数序列,替代apply方法,eg: foo(…[iterator]);
- 可以将Iterator接口的对象,转为数组, eg: […iterator];
- 复制数组、合并数组, eg: […arr], […arr1, …arr2];
- 解构赋值, 必须应用于最后一个解构变量,eg: let [a, …b] = [1, 2, 3];
- 将字符串转为字符数组,且可正确处理UTF-16的字符, eg: […’hellp’].length, 因为String类实现了Iterator接口;
数组的空位
除了在解构赋值中,数组最好不要有空位。
entries()、keys()、values()方法
在书籍中,数组的扩展其实介绍了好多新的数组api,除了entries()、keys()、values(),其它的都不准备在这里记录。这三个方法相对来说,跟ES6的知识点联系地比较紧密,尤其是后面的iterator接口掌握之后,会了解到除了数组,甚至是Object还有Set和Map都提供了entries()、keys()、values()这三个方法的支持,所以它是比较重要的。
它们用于遍历数组,且都返回一个遍历器对象,可以用for…of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。