pim*_*vdb 46 javascript arrays sizzle
我只是浏览Sizzle的源代码,我遇到了这行代码:
array = Array.prototype.slice.call( array, 0 );
Run Code Online (Sandbox Code Playgroud)
我查看了函数是什么,但我得出的结论是,它只返回从索引0开始的数组的所有元素,并将整体放入数组中,即它根本不会做任何事情.
那么这行代码的用途是什么?我错过了什么?
编辑:这是来自https://github.com/jquery/sizzle/blob/master/sizzle.js#L863的第863行.
Anu*_*rag 75
DOM通常会返回NodeList大多数操作,如getElementsByTagName.
虽然NodeList几乎感觉像阵列,但事实并非如此.它有一个length类似于数组的属性,以及一个item(index)访问给定索引处的对象的方法(也可以通过[index]符号访问),但这就是相似性结束的地方.
因此,为了能够使用精彩的数组方法而不重写它们NodeList,上述行很有用.
将其转换为数组的另一个用途是使列表静态.NodeLists通常是实时的,这意味着如果发生文档更改,NodeList对象将自动更新.这可能会导致问题,如果返回给你的jQuery对象一直在你的鼻子下面改变.请尝试以下代码段来测试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
Run Code Online (Sandbox Code Playgroud)
正如BoltClock所说,它是一个数组的(浅)副本.它也可以用来复制几乎是一个数组的东西,比如arguments内置的,它在原型链中有一个长度和项目但没有数组(因此没有切片方法).