關於js對象賦值
1.含有相同的鍵進行賦值
如:
a:{name:"",age:""}, // 需要被賦值的對象
b:{name:"xx",age:"20",sex:"男"} // 數據對象
// 將b與a相同的健進行賦值
Object.keys(this.a).forEach((key) => {
this.a[key] = this.b[key]
})
// 得到
a:{name:"x",age:"20"},
2.復制對象(遍歷賦值)
var obj = { //定義對象
x : true,
y : false
}
var obj1 = {};
for (var i in obj) { //遍歷obj對象,把它的所有成員賦值給對象obj1
obj1[i] = obj[i];
}
3.復制對象(直接賦值)
直接用=
的方式把一個對象賦值給另一個對象,會導致修改新對象時,原對象也發生變化
var obj1 = {'name': '1111'};
var obj2 = obj1;
obj2.name = '2222';
console.log(obj1.name); //'2222'
- JavaScript 中對象的賦值是默認引用賦值的(兩個對象指向相同的內存地址)
4.Object.assign()拷貝對象 (深拷貝,但沒完全深)
// 使用 Object.assign() 方法復制對象
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj2.a = 2;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
obj2.b.c = 3;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
- 可以看到當修改
obj2.b.c
的值時,原對象obj1.b.c
也跟着發生了變化,Object.assign()
只是讓對象里第一層的數據沒有了關聯性,但是對象內的對象則跟被復制的對象有着關聯性的。 Object.assign(obj)
--淺拷貝
Object.assign({},obj)
--只有第一層深拷貝 (ES6中擴展運算符...也是如此
5.JSON.parse(JSON.stringify(obj))
let obj1 = { a: 2, b: { c: 0 } }
let obj2 = JSON.parse(JSON.stringify(obj1))
- 使用場景限制:obj屬性不能是function、RegExp等,JSON序列化時會造成屬性丟失: