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:
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.