I’v come across both ways to apply Array prototypes to a native object:
arr = Array.prototype.slice.call(obj);
arr = [].slice.call(obj);
In similar fashion, getting the true type of a native array-like object:
type = Object.prototype.toString.call(obj);
type = {}.toString.call(obj);
A simple test:
function fn() {
console.log(
Array.prototype.slice.call(arguments),
[].slice.call(arguments),
Object.prototype.toString.call(arguments),
{}.toString.call(arguments)
);
}
fn(0,1);
Fiddle: http://jsfiddle.net/PhdmN/
They seem identical to me; the first syntax is used more often, but the second is definitely shorter. Are there any shortcomings when using the shorter syntax?
Array.prototype.slice() 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. The original array will not be modified.
The slice() method can be used to create a copy of an array or return a portion of an array. It is important to note that the slice() method does not alter the original array but instead creates a shallow copy.
Slice is used to get a new array from the original array whereas the splice is used to add/remove items in the original array. The changes are not reflected in the original array in the case of slice and in the splice, the changes are reflected in the original array.
Slice( ) and splice( ) methods are for arrays. The split( ) method is used for strings.
They are identical regarding functionality.
However, the Array
object can be overwritten, causing the first method to fail.
//Example:
Array = {};
console.log(typeof Array.prototype.slice); // "undefined"
console.log(typeof [].slice); // "function"
The literal method creates a new instance of Array
(opposed to Array.prototype.
method). Benchmark of both methods: http://jsperf.com/bbarr-new-array-vs-literal/3
When you're going to use the method many times, the best practice is to cache the method:
var slice = Array.prototype.slice; //Commonly used
var slice = [].slice;
- If you're concerned about the existence of Array
, or if you just like the shorter syntax.That's an interesting question! Let's pull up the pros (✔️) and cons (❌) for each alternative:
[].slice
[.slice
is a typo.slice
) faster.Contrary to what you'd think and read pretty much everywhere, [].slice.call(...)
does NOT instantiate a new, empty Array
just to access its slice
property!.
Nowadays (it has been so for 5+ years – as of late 2018), the JIT compilation (1) is included everywhere you run JavaScript (unless you're still browsing the Web with IE8 or lower).
This mechanism allows the JS Engine to: (2)
... resolve
[].slice
directly, and statically, as directArray.prototype
reference in one shot, and just one configurable property access:forEach
Array.prototype.slice
Array.prorotype.slice
) look fine until you try and run the code.Array.prototype.slice
is: (2)... a lookup for the whole scope for an
Array
reference until all scopes are walked 'till the global one ... because you can name a variableArray
any time you want.Once the global scope is reached, and the native found, the engine accesses its proottype and after that its method
...
O(N) scope resolution + 2 properties access (.prototype
and.forEach
).
(
, [
or `
[].slice
is better in pretty much every way.Note that, realistically, neither does effectively run faster than the other. This isn't the bottleneck of your application.
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