0

I was wondering about this piece of code:

var numbers, _ref;
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

[].splice.apply(numbers, [3, 4].concat(_ref = [-3, -4, -5, -6])), _ref;
alert(numbers);

From here, the result is [0, 1, 2, -3, -4, -5, -6, 7, 8, 9] and can anyone explain me about this?

Brock Adams
  • 90,639
  • 22
  • 233
  • 295
Frei Zhang
  • 417
  • 6
  • 12

3 Answers3

1

function.apply(context, argsArray) calls function in the given context, passing argsArray as the arguments for function.

In this case, function is [].splice, which takes the following parameters, in this this order:

  1. index - at which to start changing the array
  2. howMany - elements to remove, starting at index
  3. element1,...,elementN - elements to insert into the array at index

[3,4].concat(_ref = [-3, -4, -5, -6]) evaluates to an array by concatenating the two arrays together, giving [3, 4, -3, -4, -5, -6]. This is the argsArray passed to .apply(), so that:

  1. index == 3 (start at index 3)
  2. howMany == 4 (remove 4 elements)
  3. element1,...,elementN == -3, -4, -5, -6 (the elements to insert at index 3, after removal)

Thus .apply() is causing the .splice() function to run in the context of the numbers array, removing elements at indices 3, 4, 5 and 6, and then inserting the elements -3, -4, -5 and -6 between "2" and "7" in the original array.

Edit: See RobG's answer for a summary of what the original code is equivalent to (rather than an explanation of its parts).

Matt Sach
  • 1,162
  • 16
  • 37
1

Your code resolves to the following variable declarations:

var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var _ref = [-3, -4, -5, -6];

And these expressions:

numbers.splice(3, 4, -3, -4, -5, -6);
_ref;
alert(numbers);
RobG
  • 142,382
  • 31
  • 172
  • 209
0

[3, 4].concat(_ref = [-3, -4, -5, -6]) evals to [3, 4, -3, -4, -5, -6] and [].splice.apply(numbers, [3, 4, -3, -4, -5, -6])) to numbers.splice(3, 4, -3, -4, -5, -6) causing 4 elements stating from index 3 to be removed and the elements "-3, -4, -5, -6" to be inserted at the index 3. See splice.

Prusse
  • 4,287
  • 2
  • 24
  • 29