我只是在浏览 Sizzle 的源代码时遇到了这行代码:
array = Array.prototype.slice.call( array, 0 );
我查看了函数是什么,但我得出的结论是它只是返回从索引 0 开始的数组的所有元素,并将整个元素放入数组中,即它实际上并没有做任何事情。
那么这行代码有什么用呢?我错过了什么?
编辑:这是来自https://github.com/jquery/sizzle/blob/master/sizzle.js#L863的第 863 行。
我只是在浏览 Sizzle 的源代码时遇到了这行代码:
array = Array.prototype.slice.call( array, 0 );
我查看了函数是什么,但我得出的结论是它只是返回从索引 0 开始的数组的所有元素,并将整个元素放入数组中,即它实际上并没有做任何事情。
那么这行代码有什么用呢?我错过了什么?
编辑:这是来自https://github.com/jquery/sizzle/blob/master/sizzle.js#L863的第 863 行。
NodeList
对于大多数操作,DOM 通常返回一个getElementsByTagName
.
虽然 aNodeList
几乎感觉像一个数组,但它不是。它具有length
像数组一样的属性,以及item(index)
在给定索引处访问对象的方法(也可以使用[index]
符号访问),但这就是相似性结束的地方。
因此,为了能够使用出色的数组方法而无需将它们全部重写为 a NodeList
,上述行很有用。
将其转换为数组的另一个用途是使列表成为静态的。NodeLists 通常是实时的,这意味着如果发生文档更改,NodeList 对象会自动更新。如果返回给您的 jQuery 对象在您眼皮底下不断变化,这可能会导致问题。试试下面的代码片段来测试 NodeList 的活跃度。
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
这里发生的是 Sizzle 正在从一个类似数组的对象中创建一个实际的数组。类数组对象不一定有 slice() 方法,所以必须直接调用原型方法。 makeArray()
返回该类数组对象的副本,该对象是一个实际数组,并且可以在其他地方使用。
有关类似数组的对象的更多信息,请参见此处。
正如 BoltClock 所说,它制作了一个数组的(浅)副本。它也可以用来复制几乎是一个数组的东西,例如arguments
内置函数,它有一个长度和项,但它的原型链中没有数组(因此没有切片方法)。