Reputation: 417
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?
Upvotes: 0
Views: 2234
Reputation: 1170
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:
[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:
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).
Upvotes: 1
Reputation: 147403
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);
Upvotes: 1
Reputation: 4315
[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.
Upvotes: 0