ES6 数组的扩展

注:这是一篇学习笔记,记录自己在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()是对键值对的遍历。