Javascript 为什么return语句中的push方法抛出错误,而concat有效?

Javascript 为什么return语句中的push方法抛出错误,而concat有效?,javascript,Javascript,您能帮助我理解为什么在下面代码的return语句中使用push会抛出错误,而concat会按预期工作。在这两种情况下,累加器都是数组。如果我分离了push和return语句,它将按预期工作 let展平=[ [0, 1], [2, 3], [4, 5] ].右减速器(功能(a、b){ 返回a.push(b); }, []); console.log(展平)Array.prototype.push函数添加新项并返回数组的新长度,而不返回添加项的新数组 因此,在第一个代码段中,在处理第一项之后,累加

您能帮助我理解为什么在下面代码的return语句中使用
push
会抛出错误,而
concat
会按预期工作。在这两种情况下,累加器都是数组。如果我分离了
push
return
语句,它将按预期工作

let展平=[
[0, 1],
[2, 3],
[4, 5]
].右减速器(功能(a、b){
返回a.push(b);
}, []);

console.log(展平)
Array.prototype.push
函数添加新项并返回数组的新长度,而不返回添加项的新数组

因此,在第一个代码段中,在处理第一项之后,累加器将设置为数组长度:
1

1.push
(Number.push)不存在,因此会抛出错误

但是
Array.prototype.concat
是不同的。
它返回新的数组concated,使其工作。

push
返回数组的新长度,当您从
reduce
/
reduceRight
返回该长度时,该长度(一个数字)将在下一次迭代中用作累加器
a
,因为数字没有名为
push
的方法,错误被抛出

然而,
concat
是有效的,因为
concat
返回并且数组和数组有一个名为
push
的方法

如果要使用
推送
,必须先推送值,然后返回数组,如下所示:

let展平=[
[0, 1],
[2, 3],
[4, 5]
].右减速器(功能(a、b){
a、 push(…b);//首先,推送所需的值。此处使用排列语法是因为您希望推送“b”的项,而不是“b”本身
返回;//然后返回要用作下一个数组累加器的数组
}, []);

console.log(展平)
两者之间存在差异:

  • 将元素添加到数组的末尾并返回新的长度
  • 合并两个或多个数组并返回一个新数组

因为您无法推送阵列?返回新的长度。返回新的array.console.log(a.push(b))简单调试