Object.assign 合并对象

90 阅读1分钟

Object.assign() 通过复制一个或多个对象来创建一个新的对象。

1. 将obj1放在第一个参数上面会导致obj1也改变 不要忘记对象的地址引用关系

let obj1 = {
    a:1,
    b:2,
    c:3
}

let obj2 = Object.assign(obj1,{aaa:1,bbb:2},{ccc:3},{ddd:4});

console.log(obj1);
console.log(obj2);
// 运行结果
// {a: 1, b: 2, c: 3, aaa: 1, bbb: 2, }
// a: 1
// aaa: 1
// b: 2
// bbb: 2
// c: 3
// ccc: 3
// ddd: 4
// __proto__: Object

// {a: 1, b: 2, c: 3, aaa: 1, bbb: 2, }
// a: 1
// aaa: 1
// b: 2
// bbb: 2
// c: 3
// ccc: 3
// ddd: 4
// __proto__: Object

2. 在第一个参数上面放一个空的对象 那么就不会有什么问题了

let obj1 = {
    a:1,
    b:2,
    c:3
}

let obj2 = Object.assign({},obj1,{aaa:1,bbb:2},{ccc:3},{ddd:4});

console.log(obj1);
console.log(obj2);
// 运行结果
// {a: 1, b: 2, c: 3}
// a: 1
// b: 2
// c: 3
// __proto__: Object

// {a: 1, b: 2, c: 3, aaa: 1, bbb: 2, …}
// a: 1
// aaa: 1
// b: 2
// bbb: 2
// c: 3
// ccc: 3
// ddd: 4
// __proto__: Object

3. 多种类型合并,会将所有的可枚举属性都拷贝一遍,不过需要注意的是,合并的对象如果有引用类型,那么这是属于浅拷贝的

let obj1 = {
    a:null,
    b:undefined,
    c:function name(params) {
        console.log(params);
    },
    d:{},
    e:[],
    f:123
}

let obj2 = Object.assign({},obj1);

console.log(obj1);
console.log(obj2);

// 运行结果
// {a: null, b: undefined, d: {}, e: Array(0), c: ƒ, }
// a: null
// b: undefined
// c: ƒ name(params)
// d: {}
// e: []
// f: 123
// __proto__: Object

// {a: null, b: undefined, d: {}, e: Array(0), c: ƒ, }
// a: null
// b: undefined
// c: ƒ name(params)
// d: {}
// e: []
// f: 123
// __proto__: Object