为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只名叫tom的猫 2019-02-21 22:19:15
如下代码,使用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拼接的对象数组又应该如何循环赋值
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

拷贝的原因,

[].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)))


查看完整回答
反对 回复 2019-02-25
  • 1 回答
  • 0 关注
  • 494 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信