Array.prototype.slice.call(array,0)有什么用?

我只是浏览Sizzle的源代码,我碰到这行代码:

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

我查了一下这个函数是什么,但是我得出的结论是,它只是从索引0开始返回数组的所有元素,并把整个数组放到数组中,也就是说,它根本就没有做任何事情。

那么这行代码的用途是什么? 我错过了什么?

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

DOM通常为getElementsByTagName等大多数操作返回一个NodeList

虽然NodeList几乎感觉像是一个数组,但事实并非如此。 它具有像数组一样的length属性,以及访问给定索引处的对象的方法item(index) (也可以通过[index]表示法访问),但这是相似性结束的地方。

所以为了能够使用美妙的数组方法而不用全部为NodeList重写它们,上面的这一行是有用的。

将其转换为数组的另一个用法是使列表成为静态的。 NodeLists通常是活的,这意味着如果发生文档更改,NodeList对象会自动更新。 这可能会导致问题,如果一个jQuery对象返回给你不断变化在你的鼻子下。 尝试以下代码片段来testingNodeLists的活跃度。

 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正在创build一个类似数组的对象的实际数组。 类似数组的对象不一定有slice()方法,所以原型方法必须直接调用。 makeArray()返回一个类似数组的对象,它是一个实际的数组的副本,可以用作这样的其他地方。

有关类似数组的对象的更多信息,请参阅这里 。

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