【问题标题】:interesting issue with chaining array methods and push链接数组方法和推送的有趣问题
【发布时间】:2011-12-02 20:20:40
【问题描述】:

之前在搞乱一些数组的东西,发现了一个非常奇怪的警告

考虑这段代码:

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

似乎您可以传递/链接任何其他数组方法,但不能推送。虽然这不是问题,并且如果将结果传递给变量它就可以工作,但为什么会按原样中断以及为什么在此处返回长度属性?

这很好用……

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 时刻......

【问题讨论】:

    标签: javascript push


    【解决方案1】:

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

    specification中定义:

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

     

    为什么要按原样破坏?

    好吧,你自己已经回答了这个问题:.push 返回新长度,.join 没有为数字定义。

    【讨论】:

    • 啊,这是预期的行为吗?谢谢你,请问为什么返回长度而不是数组被认为是有用的,如果需要,它将包含长度属性以供检查?似乎是一个奇怪的架构决定。
    • 好吧,我不能告诉你为什么他们决定这样做,我只能做出假设。一个原因可能是没有理由返回对数组的引用,因为.push 更改了数组就地
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2020-05-11
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多