鍍金池/ 問答/數(shù)據(jù)分析&挖掘  HTML/ js使用concat拼接的對象數(shù)組在遍歷賦值時(shí)為什么會(huì)賦予同一值?

js使用concat拼接的對象數(shù)組在遍歷賦值時(shí)為什么會(huì)賦予同一值?

如下代碼,使用concat拼接的對象數(shù)組在遍歷賦值時(shí)會(huì)賦予同一值

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)

控制臺(tái)輸出如下(和閉包問題很像,但寫了立即執(zhí)行函數(shù)也是同樣的結(jié)果)

(5) [{…}, {…}, {…}, {…}, {…}]
0:{id: 4}
1:{id: 4}
2:{id: 4}
3:{id: 4}
4:{id: 4}

但不是非對象數(shù)組是賦值便沒問題

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)

控制臺(tái)輸出如下

[0, 1, 2, 3, 4]

請問為什么會(huì)發(fā)生這種情況
對于concat拼接的對象數(shù)組又應(yīng)該如何循環(huán)賦值

回答
編輯回答
下墜

又是引用問題

var a = {};
var b = a;
b.id = 1;
console.log(a)//{ id: 1 }
2018年7月7日 19:47
編輯回答
故林

拷貝的原因,
[].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)))
2018年9月16日 17:31
編輯回答
兔寶寶
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)
2018年7月22日 15:31