.slice method. How does it work, please help to explain

let groceryList = ['orange juice', 'bananas', 'coffee beans', 'brown rice', 'pasta', 'coconut oil', 'plantains'];



console.log(groceryList.slice(1, 4));


There are three possible usages of this string method.


will make a copy of an array. This creates a new reference object, not just a new reference to the old object. The copy is independent.

const a = new Array(16).fill('X');
let b = a.slice();
/* =>
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']
b[15] = 'F'
/* =>
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'F']
/* =>
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']

The thing to keep in mind about the slice() method is that it is a copy function, not a manipulator or mutation function.

Next let’s look at position to end slicing…

let c = b.slice(8);
// => ['X', 'X', 'X', 'X', 'X', 'X', 'X', 'F']

The above is a slice consisting of the latter eight elements of the full slice. (The number 8 above is the index, not the count.) It does not affect the object it is sliced from as we have already determined that it is a copy, only, and it is independent of the original so exclusively mutable.

Next we look at point to point slicing.

b[4] = '4';
b[11] = 'B';
let d = b.slice(4, 12);
// => ['4', 'X', 'X', 'X', 'X', 'X', 'X', 'B']

Always keep at the top of your mind the concept of zero-indexing and how it plays into things. It is so simple but so blustering at the same time. Really does throw us off, sometimes.


is at index 4 because '0' would be at index 0. But why is B at index 12? Answer: It’s not, really, but because it is the twelfth item in the sequence. The end is the first non-existent element index. Little things like this will catch up even a seasoned writer. That’s why we test our assumptions in a small space to make sure we’re not blowing smoke up any skirts.

The last model to examine is from the beginning to a point, which is more or less covered above so we can extrapolate from it…

let e = b.slice(0, 8); 
// => [ 'X', 'X', 'X', 'X', '4', 'X', 'X', 'X' ]

From all this we can conclude that, no arguments means a full slice, end to end; one argument means start at that index and take everything to the end; two arguments means start and end, both of which are indices as described above…


Thank you very, this is very helpful

1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.