新的 Array API


数组是经常使用的数据结构,在 ES6 中,Array上新增了一些 API 值得介绍一下。首先是替换Array构造函数用的Array.of

> Array.of(1);
[ 1 ]
> Array.of(1, 2);
[ 1, 2 ]
> Array.of(1, 2, 3);
[ 1, 2, 3 ]
> Array.of(1, 2, 3, undefined, 4);
[ 1, 2, 3, undefined, 4 ]
>

在只有一个实参的时候,不会像Array(1)new Array(1)有别于其他实参长度时的行为,如果中间有元素从缺,使用Array.of必须明确指定从缺的值是什么(nullundefined?),如果你写[1, 2, 3, ,4 ]会如何呢?索引 3 处会是空项目(empty item),不是undefined,在〈数字为特性的数组〉中谈过,空项目并不是undefined

除此之外,我想的到的,大概就是在某些场合需要指定回调函数,而你可以将Array.of传入(指定Array?认真的吗?),因为你不能将[]当成函数传入。

接着,在〈数字为特性的数组〉谈过,在 JavaScript 的世界中,你会有很多机会遇到许多长得像数组(Array-like)的对象,而有时候,你需要将这些对象转成阵例,使之具有真正数组该有的行为,这不单只是将forEach之类的方法设给该对象,还有许多琐碎的事要做。

这时 ES6 的Array.from可以省许多功夫:

> let o = {
...    '0' : 100,
...    '1' : 200,
...    '2' : 300,
...    length : 3
... };
undefined
> let arr = Array.from(o);
undefined
> arr.forEach(elem => console.log(elem));
100
200
300
undefined
> arr instanceof Array;
true
>

Array.from遇到有空项目,或转换过程会发生空项目的情况,会明确使用undefined

> Array.from([1,,2]);
[ 1, undefined, 2 ]
> Array.from({length : 4});
[ undefined, undefined, undefined, undefined ]
>

除此之外,Array.from可以接受一个回调函数,在转换过程可以进行 map 的动作:

> Array.from([1, , 3], elem => elem ? elem * 2 : 0);
[ 2, 0, 6 ]
>

如果要用某个值填满数组,那么Array.fill很方便:

> Array(10).fill(0);
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
> [1, 2, 3, 4, 5].fill(0, 2, 4);
[ 1, 2, 0, 0, 5 ]
>

Array.fill第一个参数接受要填充的值,之后选择性地接受startend,用来指定填充的索引起始与结束。

Arrayfind方法其实是 findFirst 的概念,可以找到第一个符合条件的数,找不到就返回undefinedfindIndex则是找到第一个符合条件的元素索引位置,找不到返回 -1:

> [10, 20, -30, 40].find(n => n < 0);
-30
> [10, 20, -30, 40].findIndex(n => n < 0);
2
>

findfindIndex的回调函数,其实可以接受三个实参,分别是元素值、索引与原数组参考,上面的范例只使用了元素值的部份。


展开阅读全文