js使用concat拼接的对象数组在遍历赋值时为什么会赋予同一值?

如下代码,使用concat拼接的对象数组在遍历赋值时会赋予同一值

let a = [

    {},

]

b = a.concat(a).concat(a).concat(a).concat(a)

for (let i = 0, j = b.length; i < j; i++) {

    b[i].id = i

}

console.log(b)

控制台输出如下(和闭包问题很像,但写了立即执行函数也是同样的结果)


(5) [{…}, {…}, {…}, {…}, {…}]

0:{id: 4}

1:{id: 4}

2:{id: 4}

3:{id: 4}

4:{id: 4}

但不是非对象数组是赋值便没问题

let a = [

    0,

]

b = a.concat(a).concat(a).concat(a).concat(a)

for (let i = 0, j = b.length; i < j; i++) {

    b[i] = i

}

console.log(b)

控制台输出如下


[0, 1, 2, 3, 4]

请问为什么会发生这种情况

对于concat拼接的对象数组又应该如何循环赋值


一只名叫tom的猫
浏览 495回答 1
1回答

繁星coding

拷贝的原因,[].concat(arr),arr.slice(),Object.assign([],arr),[...arr]都只针对第一层深拷贝,多层则是浅拷贝var a = [{"id":2}];var b = [].concat(a);b[0].id = 1;var c = [1];var d = [].concat(c);d[0]=2;console.log(a,b,c,d);涉及多层拷贝建议用JSON.parse(JSON.stringify(arr))b = JSON.parse(JSON.stringify(a.concat(a).concat(a).concat(a).concat(a)))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript