Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';是使用Array.prototype.slice.call(Array,0)吗?_Javascript_Arrays_Sizzle - Fatal编程技术网

Javascript 什么';是使用Array.prototype.slice.call(Array,0)吗?

Javascript 什么';是使用Array.prototype.slice.call(Array,0)吗?,javascript,arrays,sizzle,Javascript,Arrays,Sizzle,我刚刚浏览了Sizzle的源代码,发现了以下代码行: array = Array.prototype.slice.call( array, 0 ); 我查看了函数是什么,但得出的结论是,它只返回从索引0开始的数组的所有元素,并将整个元素放入数组中,也就是说,它实际上什么都不做 因此,这行代码的用途是什么?我错过了什么 编辑:这是第863行。正如BoltClock所说,它制作了一个数组的(浅)副本。它还可以用来复制几乎是数组的东西,例如参数内置,它有一个长度和项目,但原型链中没有数组(因此没有切

我刚刚浏览了Sizzle的源代码,发现了以下代码行:

array = Array.prototype.slice.call( array, 0 );
我查看了函数是什么,但得出的结论是,它只返回从索引0开始的数组的所有元素,并将整个元素放入数组中,也就是说,它实际上什么都不做

因此,这行代码的用途是什么?我错过了什么


编辑:这是第863行。

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

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

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

对于大多数操作,如
getElementsByTagName
,DOM通常会返回一个数组

虽然
节点列表
感觉像是一个数组,但它不是。它有一个与数组类似的
length
属性,还有一个方法
item(index)
,用于访问给定索引处的对象(也可以使用
[index]
符号访问),但这就是相似性结束的地方

因此,为了能够在不为
NodeList
重写它们的情况下使用精彩的代码,上面的一行很有用

将其转换为数组的另一个用途是使列表保持静态。节点列表通常是活动的,这意味着如果文档发生更改,节点列表对象将自动更新。如果返回给您的jQuery对象一直在您的眼皮底下更改,那么这可能会导致问题。尝试以下方法来测试节点列表的活跃度

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

似乎是调用
array.slice(0)
的一种有点矫揉造作的方法,它将生成数组的副本。我不明白为什么它会被如此难以理解的方式调用。上下文决定了一切。
array
标识符没有引用实际的数组。我认为是这样,但它将结果分配回同一个
array
,因此我不能完全弄清楚到底发生了什么。我可以问一下为什么
var
没有放在它前面吗?如果制作了一个副本,那么它不是一个新变量吗,即使用
var
?@BoltClock,Hmmm。。。这很奇怪。也许是给数组原型一些不真实的东西,比如参数或jQuery集。@pimvdb,这取决于上下文。这可能只是一个错误:)这样做的一个可能效果是删除数组中的任何命名成员。(当然不会影响原型。)。就像你有
var数组=['zero','one','two'];数组['someProp']='someValue'
你可以用问题中的技巧摆脱
someProp
。废话这个答案让我离真正接受JS又近了一步。多年来我一直希望它会消失+我提出的一个问题是:你如何知道数组方法可以应用于哪些对象?显然,它是任何具有长度属性和整数属性名称(从零开始?)的对象。我还了解到“arguments”变量是一个类似数组的对象,但不是一个实际数组(我不知道)。答案就在这里:@zod:如果你看看,那么肯定会有什么神奇的事情发生。它使用
.length
确定范围,然后对
执行
for
循环以复制正确的元素(这只需要具有数字键的对象)。