js中拷贝一个数组,为什么举例子喜欢用原型的slice,而不是数组实例.slice()的方式呢?

比如在一篇文章中写到:

生成当前对象的一个快照或静态副本:
var staticLists = Array.prototype.slice.call(A_HtmlCollection, 0)

为什么不是下面这种更简单吗?--> var staticLists= A_HtmlCollection.slice(0);

然后,我在git上,也看到有类似的第一种写法,这样写有什么用意吗?怕slice重名么?

阅读 2.2k
2 个回答

首先,你要知道在js中,关于数组有2类,一种就是我们日常使用的数组[],一种是张的像数组的东西,但是不是真正的数组,比如我们获取dom对象的数组(document.querySelectorAll),函数的arguments都是类数组。
slice函数是在数组对象身上有的,类数组没有,所以你直接A_HtmlCollection.slice(0)是会报TypeError错误的,因为对象上不存在这个函数。
所以如果我们要用slice这个方法,我们有2种办法:
第一是:将类数组转换成数组,比如我们可以把代码写成Array.from(A_HtmlCollection).slice(0)。类数组转换成数组有很多个方法,这里只是其中一种。
第二是:我们把数组的slice方法当成一个函数,然后我们去调用这个函数,传递我们的参数,最后得到我们的结果。就是你问题中的方法,写成Array.prototype.slice.call(A_HtmlCollection, 0)

javascipt 里有好多长得像数组,有 length 属性,也可以下标访问的对象,但他们其实不是数组。

HtmlCollection 就是这样。

这些对象不是数组对象,所以也没有 slice 方法。

推荐问题