为什么Array.prototype.push返回新的长度而不是更有用的东西?

问题描述 投票:8回答:3

自从它在ECMA-262, 3rd Edition中引入以来,Array.prototype.push方法的返回值是Number

15.4.4.7 Array.prototype.push([item1 [,item2 [,...]]])

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

返回数组的新长度背后的设计决策是什么,而不是返回可能更有用的东西,例如:

  • 对新添加的项目的引用
  • 变异数组本身

为什么这样做,并且是否有关于如何做出这些决定的历史记录?

javascript specifications return-type
3个回答
2
投票

我无法解释为什么他们选择返回新的长度,但是回应你的建议:

  • 返回新添加的项目:

鉴于JavaScript使用发出指定值的C样式赋值(而不是基本样式赋值),您仍然可以具有以下行为:

var addedItem;
myArray.push( addedItem = someExpression() );

(虽然我知道这意味着你不能将它作为声明+赋值组合中r值的一部分)

  • 返回变异数组本身:

这将是“流畅的”API的风格,在ECMAScript 3完成后显着获得了普及,并且它不会保持ECMAScript中其他库功能的风格,并且再一次,它不是那么多额外的工作来启用您创建自己的push方法后所关注的场景:

Array.prototype.push2 = function(x) {
    this.push(x);
    return this;
};

myArray.push2( foo ).push2( bar ).push2( baz );

要么:

Array.prototype.push3 = function(x) {
    this.push(x);
    return x;
};

var foo = myArray.push3( computeFoo() );

2
投票

你提出问题我很好奇。我制作了一个示例数组并在Chrome中进行了检查。

var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
console.log(arr);

enter image description here

因为我已经引用了数组以及我推入的每个对象,所以只有一个其他属性可能有用......长度。通过返回Array数据结构的这一附加值,我现在可以访问所有相关信息。这似乎是最好的设计选择。如果您想为保存1台单机指令而争辩,那么或者根本不返回任何内容。

为什么这样做,并且是否有关于如何做出这些决定的历史记录?

毫无头绪 - 我不确定存在这些方面的基本原理记录。它取决于实现者,并且很可能在实现ECMA脚本标准的任何给定代码库中进行评论。


2
投票

我理解array.push()期望返回变异数组而不是新长度。并希望将此语法用于链接原因。 但是,有一种内置的方法可以做到这一点:array.concat[]

newArray = oldArray.concat[newItem];

可以使用.concat[]而不是.push()来完成数组链接。

这是React中用于根据其先前值更改state变量的常用模式:

// the property value we are changing
selectedBook.shelf = newShelf;

this.setState((prevState) => (
  {books: prevState.books
           .filter((book) => (book.id !== selectedBook.id))
           .concat(selectedBook)
  }
));

state对象有一个books属性,它拥有一系列bookbookidshelf属性(以及其他)的对象。 setState()接受一个对象,该对象包含要分配给state的新值

selectedBook已经在books阵列,但其属性shelf需要改变。 但是,我们只能给setState一个顶级对象。 我们不能告诉它去寻找这本书,并在那本书上寻找一个属性,并给它这个新的价值。

所以我们采用books阵列。 filter删除旧版本的selectedBook。 然后concat在更新它的selectedBook财产后重新加入shelf

想要链接push的大用例。 但是,正确的方法是使用concat

简介:qazxsw poi将返回一个数字(变异数组的新长度)。 qazxsw poi将返回变异数组。

© www.soinside.com 2019 - 2024. All rights reserved.