今天排查自己用cocos开发的小游戏的bug时发现的一个问题。其实是关于js语法的,但是因为除了cocos论坛,不知道还有哪里可以讨论这种技术问题,所以只能发在这里,向各位大佬请教。
如下的一段代码:
Test() {
let array1 = new Array(5).fill({ a: 0 })
let array2 = new Array(5).fill({ a: 0 })
for (let i = 0; i < 5; i++) {
setTimeout(() => {
array1[i].a = i
array2[i] = {a:i}
console.warn("array = ", array1)
console.warn("array2 = ", array2)
}, 0.2 * i)
}
},
作用其实很简单,就是把array这个数组依次设置为{a:0}, {a:1}…
但是,如果采用第一种写法array1[i].a = i, 会发现代码完全执行完毕之后,最终array = [{a:4},{a:4},{a:4},{a:4},{a:4}]
如果是第二种写法array2[i] = {a:i}, 结果是符合预期的[{a:0},{a:1},{a:2},{a:3},{a:4}]
请问这是为什么啊?什么机制导致的会有这样的差异?
浏览器用的是chrome
受教了。