对象的合并方式

196 阅读1分钟

对象常见的合并方式有很多种,其中用的最多的莫过于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不变