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

发布于 2022-09-06 06:05:42 字数 652 浏览 12 评论 0

如下代码,使用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拼接的对象数组又应该如何循环赋值

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眼眸 2022-09-13 06:05:42

拷贝的原因,
[].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)))
不忘初心 2022-09-13 06:05:42

又是引用问题

var a = {};
var b = a;
b.id = 1;
console.log(a)//{ id: 1 }
过去的过去 2022-09-13 06:05:42
let a = [
    {},
]
b = a.concat([{}]).concat([{}]).concat([{}]).concat([{}])
for (let i = 0, j = b.length; i < j; i++) {
    b[i].id = i
}
console.log(b)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文