.slice(0)在这里有什么意义?


74

当我找到jQuery源时(v1.5第2295行),我正在研究它:

namespace = new RegExp("(^|\\.)" +
  jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");

我的问题是,为什么slice(0)在这里使用?

Answers:


118

sort() 修改它所调用的数组-改变其他代码可能依赖的内容不是很好。

slice()总是返回一个新数组-返回的数组slice(0)与输入相同,这基本上意味着复制数组是一种廉价的方法。


3
@ide答案更精确:“还用于将类似数组的对象转换为数组”
Michael Laffargue 16-03-09

32

arr.slice(0) 通过从索引0的元素到最后一个元素进行切片来复制原始数组。

它还用于将类似数组的对象转换为数组。例如,DOM NodeList(由多个DOM方法返回getElementsByTagName)不是数组,而是具有length字段的类似数组的对象,并且可以在JavaScript中建立索引。要将其转换为数组,通常使用:

var anchorArray = [].slice.call(document.getElementsByTagName('a'), 0)

1
对于document.getElementsByName(在Firefox 3.16中)返回的值,slice是'undefined'。我曾经使用过:var iiNodes = [],tmp = editorDocument.getElementsByName(“ intInfo”); for(var ii = 0; ii <tmp.length; ii ++){iiNodes.push(tmp [ii]); 来解决问题。

2
HTMLCollection.slice是未定义的,但是Array.slice确实存在,因此[] .slice.call业务。
ide

在我看到的示例中,const nav = Array.prototype.slice.call(document.querySelectorAll('.nav'), 0);为什么使用Array.prototype比[]更好?
chetan92 '20

5

slice(0)创建一个与原始数组相同的新数组。很多时候您想保留原始数组并创建一个新数组。

如果使用slice(1),它将从索引位置1开始创建另一个数组。

字符串也是如此。


1

slice(0) 允许您返回引用的现有数组的数组,在本例中为名称空间。


1

除了@Anon说的:

slice()方法选择从给定start参数开始的元素,并以给定end参数结束但不包括给定end参数的元素。

范例1:

var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1, 3);

柑橘的结果将是:

Orange,Lemon

范例2:

var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(-3, -1);

柑橘的结果将是:

Lemon,Apple

可以在此处找到更多信息。


1
不,结果将["Lemon", "Apple"]是准确的。我们都知道会发生什么slice()。Stackoverflow不适用于重新编写文档。问题在于重点是什么slice(0)。在这种情况下,您的问题根本无法回答。
zfj3ub94rf576hc4eegm '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.