转换类数组对象,Array.prototype.slice 或 Array.from
Posted
技术标签:
【中文标题】转换类数组对象,Array.prototype.slice 或 Array.from【英文标题】:Convert Array-like objects, Array.prototype.slice or Array.from 【发布时间】:2016-08-27 23:54:15 【问题描述】:我知道有两种方法可以将类数组对象转换为数组。
Array.prototype.slice.call(arguments)
Array.from(arguments)
我想知道它们之间有什么区别,我应该使用哪一个来转换类似数组的对象。
【问题讨论】:
就Browser compatibility而言,使用Array.prototype.slice.call(arguments)
(虽然Polyfill
可用...)
或[...arguments]
。
但是在旧的 IE 8 及更低版本中要小心。如果宿主对象作为 this 传递给内置方法(例如,将 html 集合作为 this 传递给 slice)你会得到一个错误。但是,如果您有一个用于 from 的 polyfill,那将不是问题。
【参考方案1】:
Array.prototype.slice.call
是一种将类数组对象转换为数组的长期机制。如果您正在寻找浏览器兼容性,请使用此功能(尽管在某些较旧的浏览器(如 IE8 及以下版本)上似乎根本无法使用)。
Array.from
于 2015 年 6 月引入 ECMA6。它完成了与之前的机制相同的事情,只是以更流畅和简洁的方式。另外Array.from
可以将更多的结构体转化为生成器等数组。
了解array.from
【讨论】:
其实Array.from
完成了更多,因为它可以将生成器变成数组等
作为记录,ECMA-262 是标准的名称(所有版本)。 ECMAScript 是语言的名称。 Edition 6 是 ECMA-262 的当前版本,它的简称是 ECMAScript 2015。【参考方案2】:
Array.prototype.slice.call(arguments)
在许多浏览器中的运行速度都比Array.from(arguments)
快。
您可以在这里查看results。
【讨论】:
它的速度也非常惊人。而且它只会在新版 Chrome 中变得更快。【参考方案3】:如果您希望您的代码具有可移植性,请使用第一种方法。第二种方法是 ECMAscript 6 的一部分,因此在一系列浏览器中都没有得到很好的支持。
【讨论】:
【参考方案4】:slice 适用于任何具有长度属性的东西,而参数很方便。
Array.from 简单地将类 Array 或 Iterable 对象转换为 Array 实例。
很遗憾,Array.from 和 Rest 参数目前仅在较新版本的 Firefox 和 Google Chrome 中实现
请参考link
【讨论】:
以上是关于转换类数组对象,Array.prototype.slice 或 Array.from的主要内容,如果未能解决你的问题,请参考以下文章
angularjs中怎样判断一个元素是不是在一个数组中存在?