6

Previous posts have talked about how Array.prototype.slice.call(arguments) work but I don't get why you're using call instead of apply when apply is used for array-like objects whereas call is used on lists of objects separated by commas. Isn't arguments an array-like object that should used apply instead of call?

stackjlei
  • 9,485
  • 18
  • 65
  • 113
  • 3
    Even if you used `apply` instead of `call`, `arguments` is the [`thisArg`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply), not the `argsArray`, so it wouldn't change anything. – user2357112 Sep 28 '16 at 00:10
  • your link is broken, so can't tell if you're reading it right – Jaromanda X Sep 28 '16 at 00:10
  • 1
    Were you intending to link to this post? [how does Array.prototype.slice.call() work?](https://stackoverflow.com/questions/7056925/how-does-array-prototype-slice-call-work) – Jonathan Lonowski Sep 28 '16 at 00:19
  • 2
    The 1st argument passed to each method is the same. The difference between them is in the 2nd or further arguments. `.call(thisArg, arg0, arg1, ...)` vs. `apply(thisArg, argsList)`. The value given for `thisArg` becomes the value of `this` used by the function being invoked (`slice`). – Jonathan Lonowski Sep 28 '16 at 00:21
  • 2
    Side note: [`Array.from()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from) was added to a recent edition of the language to in part replace this use of `slice`. – Jonathan Lonowski Sep 28 '16 at 00:27
  • 1
    Possible duplicate of [What is the difference between call and apply?](http://stackoverflow.com/q/1986896/218196) – Felix Kling Sep 28 '16 at 00:28

2 Answers2

4

If you'd like to pass arguments to slice in array instead of one by one, then there is a difference. You could do it this way

[1, 2, 3, 4, 5, 6, 7]  ---- our example arguments
Array.prototype.slice.call(arguments, 2, 5);

here you pass to slice method 2 and 5 and these are slice arguments to indicate that you want to get items at index 1 to item at index. 4. So most likely it will be 3, 4, 5.

Array.prototype.slice.apply(arguments, [2, 5]);

This does the same but arguments for slice can be passed in an array.

uRTLy
  • 129
  • 1
  • 6
  • so if I don't pass any arguments, apply and call is the same? – stackjlei Sep 28 '16 at 00:22
  • 1
    Yes, then they work the same. btw. If you dont pass any argument slice just copies the array - no matter if you call it or apply it. – uRTLy Sep 28 '16 at 00:25
2

If x is an array, then these are the same:

// find the "slice" method of an array and call it with "x" as its "this" argument
x.slice();

// find the "slice" method of an array and call it with "x" as its "this" argument
Array.prototype.slice.call(x);

The first argument of func.call is this this argument, or, the value of this inside the function. The remaining arguments are the arguments of the function (in this case there are none).

The slice method, called with no arguments, simply creates a new array with the same contents. That's what we want to do when we do Array.prototype.slice.call(arguments), however, since arguments isn't an array and therefore has no slice method attach to itself, we have to use the second of the two methods to get the slice method of an array, and then apply that to something that's not an array:

// find the "slice" method of an array and call it with "arguments",
// which is *not* an array, as its "this" argument
Array.prototype.slice.call(arguments);
Frxstrem
  • 38,761
  • 9
  • 79
  • 119