es6
新特性中Array
类多了一个静态方法from
,这个方法作用是将一个ArrayLike
对象或者Iterable
对象转换成一个Array
,本文只讨论ArrayLike
对象相关内容。
所谓ArrayLike
对象指具有数组某些行为的对象,表现出来的特征就是具有length
属性。
var obj = {
"0" : 1,
length: 1
};
这一类对象不能调用数组所具有的方法(push/forEach/map之类),最常见的有两种:DOM中的NodeList
和函数中的arguments
。
在平常开发中,我们经常遇到需要将这两种对象转化为真正数组的场景,一般我们是这么写:
var args = [].slice.call(arguments);
var imgs = [].slice.call(document.querySelectorAll('img'));
现在我们有了Array.from
,可以这样写。
var args = Array.from(arguments);
var imgs = Array.from(document.querySelectorAll('img'));
不考虑兼容性的话,我们就可以直接用Array.from
了。前面说了Array.from
的一些内容,既然标题说了妙用
,自然还要来点新的东西。
有时我们会遇到这样的场景,需要创建一个包含从0到99(n)的连续整数的数组。以前我们会这样写
var arr = [];
for(var i = 0; i <= 99; i++) {
arr.push(i);
}
这种方法最直观了,性能也很好。只是不喜欢写for循环
的同学可能不会这样写,所以有人搞出了下面这种写法
var arr = Array(100).join(' ').split('').map(function(item,index){return index});
这种方法中Array(100)
创建了一个包含100个空位的数组。
但是这样的数组是没法迭代的(参考forEach
方法的定义),
所以要通过字符串转换,覆盖undefined
,最后调用map
修改元素值。
有了es6
,用Array.from
的写法是这样的
var arr = Array.from({length:100}).map(function(item,index){return index});
这种方法中Array.from({length:100})
也是创建了一个包含100个undefined
的数组,
但是这个数组可以迭代([].slice.call({length:100})创建的不可迭代
),可以直接调用map
方法。
上面的代码其实包含了一个重要的信息,Array.from
创建的数组是可以迭代的(参考Array.from
方法的定义),
即使元素值都是undefined
。所以Array.from
还可以用来实现次数确定的循环遍历。例如在写React
组件时,有时要map
迭代确定次数,生成html
。
Array.from
好用归好用,不过在性能上却有些尴尬。上面三种方法第一种性能最好,第二种次之,第三种最差。具体数据可以看这里constarray
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。