I was trying to understand what is the difference between spread syntax vs slice method in the following approach.
suppose I want to make an actual copy of an array, I can probably easily do it using spread syntax
var fruits = ["Banana", "Chips" , "Orange", "Lemon", "Apple", "Mango"] var newCitrus = [...fruits]
If I console.log this
["Banana", "Chips", "Orange", "Lemon", "Apple", "Mango"]
but I can also create a copy of an array using the slice method. Considering the same array above, if I do something like this...
var citrus = fruits.slice(0);
and then console log it, it will give me exactly the same array which I would've got through spread syntax
["Banana", "Chips", "Orange", "Lemon", "Apple", "Mango"]
Since both of them takes about the same time to code/write, What is the difference here? which approach should I usually choose?
Spread syntax ( ... ) allows an iterable, such as an array or string, to be expanded in places where zero or more arguments (for function calls) or elements (for array literals) are expected.
The splice() method returns the removed items in an array. The slice() method returns the selected element(s) in an array, as a new array object. The splice() method changes the original array and slice() method doesn't change the original array.
Slice() is used to extract elements from an array and return a new array, and it would not modify the origin array. Split() is used to convert the input string into an array by the separator, and since string is immutable, it would not modify the origin string.
The slice() method returns a shallow copy of a portion of an array into a new array object selected from start to end ( end not included) where start and end represent the index of items in that array.
Performance aside slice
is just a function on Array.prototype
so it will work only for arrays. Spread syntax on the other hand will work for any iterable (object which satisfy iterable protocol) so it will work out of the box on any String
, Array
, TypedArray
, Map
and Set
. You can also easily create custom iterables.
There is also a difference when it comes to slice
ing and spread
ing arrays with holes (sparse arrays). As you can see below, slice
will preserve sparseness while spread
will fill holes with undefined
.
Array(3) // produces sparse array: [empty × 3] Array(3).slice() // produces [empty × 3] [...Array(3)] // produces [undefined, undefined, undefined]
Spread syntax can also be used to make shallow clones of objects:
const obj = { foo: 'bar', baz: 42 }; const clone = { ...obj }; obj.foo === clone.foo // true obj.baz === clone.baz // true obj === clone // false (references are different)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With