对象常见的合并方式有很多种,其中用的最多的莫过于Object.assign()以及对象展开运算
Object.assign()
1.用此方法的除了能达到目标对象的合并,对源对象有何影响呢?
const o1 = { a: 1 };
const o2 = { b: 2 };
const o3 = { c: 3 };
Object.assign(o1, o2, o3);
console.log(o1,o2,o3); o1将作为主要的合并后的输出源,而o2,o3则无变
o1得到的值与const obj=Object.assign(o1,o2,o3)是一致的
2.合并具有相同属性的对象,最新值替换旧值,其他不变
const o1 = { a: 1, b: 1, c: 1 };
const o2 = { b: 2, c: 2 };
const o3 = { c: 3 };
const obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }3.继承属性和不可枚举属性是不能拷贝的
const obj = Object.create({foo: 1}, { // foo 是个继承属性。
bar: {
value: 2 // bar 是个不可枚举属性。
},
baz: {
value: 3,
enumerable: true // baz 是个自身可枚举属性。
}
});
const copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }4.拷贝访问器
const obj = {
foo: 1,
get bar() {
return 2;
}
};
let copy = Object.assign({}, obj);
console.log(copy); // { foo: 1, bar: 2 } copy.bar的值来自obj.bar的getter函数的返回值展开运算符
与object.assign()类似。扩展运算符(Object spread)不复制继承的属性或类的属性,但是它会复制ES6的 symbols 属性Object.assign()会触发setter,而展开操作符则不会。
const obj = { a: 'a', b: 'b', c: 'c' };
console.log(Object.assign(obj,{d:'d'}));
//{a: "a", b: "b", c: "c", d: "d"}
console.log(obj)
//{a: "a", b: "b", c: "c", d: "d"}原来的obj被修改了
console.log({...obj,d:'d'});
//{a: "a", b: "b", c: "c", d: "d"}
console.log(obj)
//{ a: 'a', b: 'b', c: 'c' };//原来的obj不变