链接数组方法和推送的有趣问题

时间:2011-10-07 08:42:09

标签: javascript push

早些时候搞乱了一些数组,发现了一个非常奇怪的警告

考虑这段代码:

[1,2,3].map(function(el) { return el * 2}).push(4*2).join(" ");

写作时,我希望得到:2, 4, 6, 8

相反,它抛出了异常。在进一步调查中,.push返回已传递数组的调整后的.length

[1,2,3].map(function(el) { return el * 2}).push(4*2);
>>> 4

[1,2,3,4].map(function(el) { return el * 2}).push("hi");
>>> 5

和typeof是数字,因此.join会抛出,因为它不在数字proto中。

似乎你可以传递/链接任何其他数组方法但不能推送。虽然这不是一个问题,如果你将结果传递给一个变量,它的工作原理是什么,为什么会破坏原因,为什么这里返回的是length属性?

这很好......

var foo = [1,2,3,4].map(function(el) { return el * 2});
foo.push(5*2);
console.log(foo); 
>>> [2, 4, 6, 8, 10]; 

可能是另一个wtfjs时刻......

1 个答案:

答案 0 :(得分:3)

  

为什么要在这里返回长度属性?

它在specification

中定义
  

参数将按照它们出现的顺序附加到数组的末尾。作为调用的结果,返回数组的新长度。

  

为什么要按原样打破?

嗯,您自己已经回答了这个问题:.push返回新的长度,并且没有为数字定义.join