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

JavascriptJqueryType ConversionSlice

Javascript Problem Overview


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?

Javascript Solutions


Solution 1 - Javascript

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.

Solution 2 - Javascript

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')]

Solution 3 - Javascript

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.

Solution 4 - Javascript

slice(0) allows you to return an array of the existing array you're referencing, in this case namespaces.

Solution 5 - Javascript

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmVChrView Question on Stackoverflow
Solution 1 - JavascriptAnon.View Answer on Stackoverflow
Solution 2 - JavascriptideView Answer on Stackoverflow
Solution 3 - JavascriptAbhiView Answer on Stackoverflow
Solution 4 - JavascriptTNCView Answer on Stackoverflow
Solution 5 - JavascriptLuis TeijonView Answer on Stackoverflow