What's the use of Array.prototype.slice.call(array, 0)?

前端 未结 3 811
无人共我
无人共我 2020-12-07 11:30

I was just browsing Sizzle\'s source code and I came across this line of code:

array = Array.prototype.slice.call( array, 0 );

I looked up

相关标签:
3条回答
  • 2020-12-07 11:49

    The DOM usually returns a NodeList for most operations like getElementsByTagName.

    Although a NodeList almost feels like an array, it is not. It has a length property like an array does, and a method item(index) to access an object at the given index (also accessible with the [index] notation), but that's where the similarity ends.

    So to be able to use the wonderful array methods without rewriting them all for a NodeList, the above line is useful.

    Another use of converting it to an array is to make the list static. NodeLists are usually live, meaning that if document changes occur, the NodeList object is automatically updated. That could cause problems, if a jQuery object returned to you kept changing right under your nose. Try the following snippet to test the liveness of NodeLists.

    var p = document.getElementsByTagName('p');
    console.log(p.length); // 2
    document.body.appendChild(document.createElement('p'));
    // length of p changes as document was modified
    console.log(p.length); // 3
    
    0 讨论(0)
  • 2020-12-07 11:52

    What's happening here is that Sizzle is creating an actual array out of an array-like object. The array-like object doesn't necessarily have the slice() method, so the prototype method has to be called directly. makeArray() returns a copy of that array-like object that is an actual array, and can be used as such else where.

    See here for more information about array-like objects.

    0 讨论(0)
  • 2020-12-07 12:00

    As BoltClock says, it makes a (shallow) copy of an array. It can also be used to copy something that is almost an array, such as the arguments builtin, which has a length and items but no Array in its prototype chain (and hence no slice method).

    0 讨论(0)
提交回复
热议问题