自从它在ECMA-262, 3rd Edition中引入以来,Array.prototype.push
方法的返回值是Number
:
15.4.4.7 Array.prototype.push([item1 [,item2 [,...]]])
参数按照它们出现的顺序附加到数组的末尾。作为调用的结果,返回数组的新长度。
返回数组的新长度背后的设计决策是什么,而不是返回可能更有用的东西,例如:
为什么这样做,并且是否有关于如何做出这些决定的历史记录?
我无法解释为什么他们选择返回新的长度,但是回应你的建议:
鉴于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() );
你提出问题我很好奇。我制作了一个示例数组并在Chrome中进行了检查。
var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
console.log(arr);
因为我已经引用了数组以及我推入的每个对象,所以只有一个其他属性可能有用......长度。通过返回Array数据结构的这一附加值,我现在可以访问所有相关信息。这似乎是最好的设计选择。如果您想为保存1台单机指令而争辩,那么或者根本不返回任何内容。
为什么这样做,并且是否有关于如何做出这些决定的历史记录?
毫无头绪 - 我不确定存在这些方面的基本原理记录。它取决于实现者,并且很可能在实现ECMA脚本标准的任何给定代码库中进行评论。
我理解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
属性,它拥有一系列book
。
book
是id
和shelf
属性(以及其他)的对象。
setState()
接受一个对象,该对象包含要分配给state
的新值
selectedBook
已经在books
阵列,但其属性shelf
需要改变。
但是,我们只能给setState
一个顶级对象。
我们不能告诉它去寻找这本书,并在那本书上寻找一个属性,并给它这个新的价值。
所以我们采用books
阵列。
filter
删除旧版本的selectedBook
。
然后concat
在更新它的selectedBook
财产后重新加入shelf
。
想要链接push
的大用例。
但是,正确的方法是使用concat
。
简介:qazxsw poi将返回一个数字(变异数组的新长度)。 qazxsw poi将返回变异数组。