我只是在浏览Sizzle的源代码,我遇到了这行代码:
array = Array.prototype.slice.call( array, 0 );
我查看了函数是什么,但我得出的结论是它只返回从索引0开始的数组的所有元素,并将整体放入数组中,即它根本不会做任何事情。
这段代码的用途是什么?我错过了什么?
编辑:这是https://github.com/jquery/sizzle/blob/master/sizzle.js#L863的第863行。
答案 0 :(得分:75)
对于getElementsByTagName
等大多数操作,DOM通常会返回NodeList
。
虽然NodeList
几乎感觉像是阵列,但事实并非如此。它具有像数组一样的length
属性,以及用于访问给定索引处的对象的方法item(index)
(也可以使用[index]
表示法访问),但这是相似性结束的地方。
为了能够使用精彩的array methods而无需为NodeList
重写所有内容,上述内容很有用。
将其转换为数组的另一个用途是使列表保持静态。 NodeLists通常是实时的,这意味着如果发生文档更改,NodeList对象将自动更新。这可能会导致问题,如果返回给你的jQuery对象一直在你的鼻子下面改变。请尝试以下snippet来测试NodeLists的活跃度。
var p = document.getElementsByTagName('p');
console.log(p.length); // 2
document.body.appendChild(document.createElement('p'));
// length of p changes as document was modified
console.log(p.length); // 3
答案 1 :(得分:10)
这里发生的事情是Sizzle正在从类似数组的对象中创建一个实际的数组。类数组对象不一定具有slice()方法,因此必须直接调用prototype方法。 makeArray()
返回一个类似于数组的对象的副本,该对象是一个实际的数组,并可以在其他地方使用。
有关类似数组的对象的更多信息,请参阅here。
答案 2 :(得分:6)
正如BoltClock所说,它是一个(浅)数组的副本。它也可以用来复制几乎一个数组的东西,比如arguments
内置的,它的原型链中有一个长度和项但没有数组(因此没有切片方法) )。