JS面临奇怪的问题。我收到错误:
let a = []
let b = [1,2,3]
b.forEach(a.push)
TypeError: Array.prototype.push called on null or undefined
at Array.forEach (native)
at repl:1:3
at REPLServer.defaultEval (repl.js:262:27)
at bound (domain.js:287:14)
at REPLServer.runBound [as eval] (domain.js:300:12)
at REPLServer.<anonymous> (repl.js:431:12)
at emitOne (events.js:82:20)
at REPLServer.emit (events.js:169:7)
at REPLServer.Interface._onLine (readline.js:211:10)
at REPLServer.Interface._line (readline.js:550:8)
当然,我已经提出了一个建议,即背景丢失了。所以,我试图以这种方式实现这一目标:
b.forEach([].push.bind(a))
结果变得不可预测:
[ 1, 0, [ 1, 2, 3 ], 2, 1, [ 1, 2, 3 ], 3, 2, [ 1, 2, 3 ] ]
什么? =)从哪里来的0?好吧,也许它的&#34;故障&#34; -index,但为什么不先? :)
为了说清楚,这是一种经典的方式,这不是一个问题:
b.forEach(el => a.push(el) )
有人可以解释这种奇怪的行为吗?
答案 0 :(得分:7)
基本上,根据forEach
的标准语法,它有3个不同的参数,current item
,index
和array
,调用forEach。因此,每次使用这些参数都会调用与push
绑定的a
函数。这就是问题所在。
iteration 1 : a.push(1,0,[1,2,3]) //since a was bound with push
iteration 2 : a.push(2,1,[1,2,3])
iteration 3 : a.push(3,2,[1,2,3])
您的代码将像上面一样执行。
答案 1 :(得分:0)
因为.forEach()
会为你的回调提供3个参数。
使用三个参数调用回调:
- 元素值
- 元素索引
- 正在遍历的数组
醇>
.push()
可以接受任意数量的参数。因此,在每次迭代时,.push()
会将这三个参数添加到您的数组中。