转换类数组对象,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中怎样判断一个元素是不是在一个数组中存在?

Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。

javascript 将类数组对象转换为数组

一个类数组对象转换为一个真正的数组

对象数组(基本情况)和派生类之间的动态转换

转换类数组对象,Array.prototype.slice 或 Array.from