这里使用 .slice(0) 有什么作用?

79

我在研究 jQuery 的源代码时,发现了以下内容(v1.5 行 2295):

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

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

5个回答

130

sort()会修改调用它的数组 - 这样做可能会影响其他代码依赖的变量,所以不太好。

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


3
@ide的回答更为精确: "也用于将类数组对象转换为数组" - Michael Laffargue

36

arr.slice(0) 取自从索引位置0到最后一个元素的数组片段,用于复制原始数组。

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

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

现在,ES2015的扩展语法用于将可迭代对象(包括NodeListHTMLCollection)转换为数组:

const anchorArray = [...document.getElementsByTagName('a')]

1
在Firefox 3.16中,使用document.getElementsByName返回的值的slice为“undefined”。我使用了以下代码来解决这个问题:var iiNodes = [],tmp = editorDocument.getElementsByName(“intInfo”); for(var ii = 0; ii <tmp.length; ii ++){iiNodes.push(tmp [ii]);} - Ribo
3
HTMLCollection.slice 是未定义的,但 Array.slice 存在,因此需要使用 [].slice.call 来处理。 - ide
在我看到的一个例子中,const nav = Array.prototype.slice.call(document.querySelectorAll('.nav'), 0); 为什么使用Array.prototype比[]更好? - kchetan

8

slice(0) 创建与原始数组完全相同的新数组。许多时候,您希望保留原始数组并创建一个新数组。

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

对于字符串也是类似的。


1

slice(0) 允许你返回一个已存在的数组,即命名空间数组。


-1
除了@Anon所说的之外: < p > < code > slice() 方法选择从给定的开始参数开始的元素,并在给定的结束参数处结束,但不包括该参数。
示例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

更多信息可以在这里找到。


2
不,确切地说结果将是["Lemon", "Apple"]。我们都知道slice()的作用。Stackoverflow不是为了重复文档内容。问题是关于slice(0)的意义。在这个上下文中,你的问题根本没有回答到这一点。 - zfj3ub94rf576hc4eegm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接