0

我想知道这段代码:

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);

这里,结果是[0, 1, 2, -3, -4, -5, -6, 7, 8, 9] ,任何人都可以解释一下吗?

4

3 回答 3

1

您的代码解析为以下变量声明:

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

还有这些表达:

numbers.splice(3, 4, -3, -4, -5, -6);
_ref;
alert(numbers);
于 2011-11-22T12:13:44.357 回答
1

function .apply(context, argsArray) 在给定的上下文中调用function,将 argsArray 作为function的参数传递。

在这种情况下,函数is [].splice,它采用以下参数,按以下顺序:

  1. index - 开始更改数组的位置
  2. howMany - 要删除的元素,从索引开始
  3. element1,...,elementN - 要插入到数组中索引处的元素

[3,4].concat(_ref = [-3, -4, -5, -6])通过将两个数组连接在一起来计算一个数组,给出[3, 4, -3, -4, -5, -6]. 这是传递给 的 argsArray .apply(),因此:

  1. index == 3(从索引 3 开始)
  2. howMany == 4(删除 4 个元素)
  3. element1,...,elementN == -3, -4, -5, -6(删除后要在索引 3 处插入的元素)

因此.apply()导致.splice()函数在数组的上下文中运行numbers,删除索引 3、4、5 和 6 处的元素,然后在“2”和“7”之间插入元素 -3、-4、-5 和 -6在原始数组中。

编辑:请参阅 RobG 的答案以了解原始代码等效的摘要(而不是对其部分的解释)。

于 2011-11-22T12:07:13.330 回答
0

[3, 4].concat(_ref = [-3, -4, -5, -6])evals to[3, 4, -3, -4, -5, -6][].splice.apply(numbers, [3, 4, -3, -4, -5, -6]))tonumbers.splice(3, 4, -3, -4, -5, -6)导致从索引 3 开始的 4 个元素被删除,并在索引 3 处插入元素“-3、-4、-5、-6”。参见splice

于 2011-11-22T12:02:06.427 回答