简体   繁体   中英

What's the point of .slice(0) here?

I was studying the jQuery source when I found this (v1.5 line 2295):

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

My question is, why use slice(0) here?

sort() modifies the array it's called on - and it isn't very nice to go around mutating stuff that other code might rely on.

slice() always returns a new array - the array returned by slice(0) is identical to the input, which basically means it's a cheap way to duplicate an array.

arr.slice(0) makes a copy of the original array by taking a slice from the element at index 0 to the last element.

It was also used to convert array-like objects into arrays. For example, a DOM NodeList (returned by several DOM methods like getElementsByTagName ) is not an array, but it is an array-like object with a length field and is indexable in JavaScript. To convert it to an array, one often used:

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

Now, ES2015's spread syntax is used to convert iterable objects, including NodeList and HTMLCollection , to arrays:

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

slice(0) creates a new array identical to the original array. Many times you want to preserve your original array and create a new one.

If you use slice(1) , it will create a different array starting from index position 1.

Similar things hold for strings as well.

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

In addition to what @Anon said:

The slice() method selects the elements starting at the given start argument, and ends at, but does not include, the given end argument.

Example1:

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

The result of citrus will be:

Orange,Lemon

Example2:

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

The result of citrus will be:

Lemon,Apple

Further information can be found here .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM