如何克隆数组并在链中推送新值?

How to clone an array and push new value in a chain?

如果我克隆一个数组并像这样推送一个值:

var arr1 = ["foo", "bar"];
var arr2 = [...arr1];
arr2.push("moo");

console.log(arr2); //["foo", "bar", "moo"]

它的行为符合我的预期。但是,如果我像这样链接 push 方法:

var arr1 = ["foo", "bar"];
var arr2 = [...arr1].push("moo");

console.log(arr2); //3 WTF?

我没想到。为什么链接 .push() 就像第二个示例 return 数字 3 而不是值数组?

array.push returns 您存储在 arr2 变量中的数组的新长度。

您需要以下内容:

var arr1 = ["foo", "bar"];
var arr2 = arr1.concat("moo");
console.log(arr2); 

正如mehulmpt所说,Array.prototype.push() returns推入数组后的新长度。但是,使用 concat 非常慢。相反,spread 切片第一个数组和 push 新值在单独的行上:

const arr1 = ["foo", "bar"];
const arr2 = arr1.slice();
arr2.push("moo");

console.log(arr1, arr2)

JSPerf here

编辑:完全忘记了切片。切片比传播更快,请改用它。

如果你绝对想强制执行链接,你可以在数组原型上创建你自己的函数。 (虽然你应该明白its implication。)

我建议不要使用相同的方法名称,所以如果您想沿用该方法,请发明您自己的名称。

这是一个例子:

Array.prototype.add = function(elem) {
    this.push(elem)
    return this
}

const myArray = [].add("foo").add("bar")

console.log(myArray) // logs: [ 'foo', 'bar' ]