46

我只是在浏览 Sizzle 的源代码时遇到了这行代码:

array = Array.prototype.slice.call( array, 0 );

我查看了函数是什么,但我得出的结论是它只是返回从索引 0 开始的数组的所有元素,并将整个元素放入数组中,即它实际上并没有做任何事情。

那么这行代码有什么用呢?我错过了什么?

编辑:这是来自https://github.com/jquery/sizzle/blob/master/sizzle.js#L863的第 863 行。

4

3 回答 3

76

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
于 2011-02-28T17:13:31.870 回答
11

这里发生的是 Sizzle 正在从一个类似数组的对象中创建一个实际的数组。类数组对象不一定有 slice() 方法,所以必须直接调用原型方法。 makeArray()返回该类数组对象的副本,该对象是一个实际数组,并且可以在其他地方使用。

有关类似数组的对象的更多信息,请参见此处。

于 2011-02-28T17:09:59.260 回答
6

正如 BoltClock 所说,它制作了一个数组的(浅)副本。它也可以用来复制几乎是一个数组的东西,例如arguments内置函数,它有一个长度和项,但它的原型链中没有数组(因此没有切片方法)。

于 2011-02-28T17:06:10.533 回答