比如在一篇文章中写到:
生成当前对象的一个快照或静态副本:
var staticLists = Array.prototype.slice.call(A_HtmlCollection, 0)
为什么不是下面这种更简单吗?--> var staticLists= A_HtmlCollection.slice(0);
然后,我在git上,也看到有类似的第一种写法,这样写有什么用意吗?怕slice重名么?
比如在一篇文章中写到:
生成当前对象的一个快照或静态副本:
var staticLists = Array.prototype.slice.call(A_HtmlCollection, 0)
为什么不是下面这种更简单吗?--> var staticLists= A_HtmlCollection.slice(0);
然后,我在git上,也看到有类似的第一种写法,这样写有什么用意吗?怕slice重名么?
javascipt 里有好多长得像数组,有 length 属性,也可以下标访问的对象,但他们其实不是数组。
HtmlCollection 就是这样。
这些对象不是数组对象,所以也没有 slice 方法。
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
6 回答1.2k 阅读
首先,你要知道在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)
。