2011-10-07 27 views
2

有趣的问题是,与之前一些阵列东西乱搞,发现一个非常奇特的警告与链阵列的方法,推动

考虑下面的代码:

[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抛出,因为它不是在数原。

看来你可以传递/链任何其他数组方法,但不推动。虽然这不是问题,但如果将结果传递给变量,它会起作用,为什么按照原样打开,为什么返回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一刻......

回答

3

为什么这里正在返回的长度财产?

它在specification定义:

的参数被附加到阵列的端部,在它们出现的顺序。作为调用的结果,返回数组的新长度。

 

为什么分手的是什么?

那么,你自己已经回答了这个问题:.push返回新的长度和.join未定义为数字。

+0

啊所以这是打算的行为?感谢那,请问为什么返回长度而不是数组会被认为是有用的,如果需要的话,它将包含长度属性以供检查?看起来像一个奇怪的架构决定。 –

+0

嗯,我不能告诉你*为什么他们决定这样做,我只能做出假设。原因之一可能是没有理由返回数组的引用,因为'.push'就地改变了数组*。 –