总结Object.assign()用法
程序员文章站
2022-04-04 23:29:49
...
Object.assign(target,…source):用于将所有可枚举属性(enumerable: true)的值从一个或多个源对象(source)复制到目标对象(taget),并将返回目标对象。
一、Object.assign()对象的拷贝
注意:
1.如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。
后面的源对象的属性将类似地覆盖前面的源对象的属性
2.Object.assign()方法只会拷贝源对象自身的且可枚举的属性到目标对象。
该方法使用源对象的[[Get]]和目标对象的[[set]],所以它会调用相关getter和setter。
因此,它分配属性,不仅仅是复制或定义新的属性。如果合并源包含getter,
这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)
复制到原型,应使用Object.getOwnPropertyDescriptor()
和Object.defineProperty()。
二、Object.assign()对象的深拷贝
针对深层拷贝,需要使用其他方法,因为Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也指向那个引用。
三、对象的合并
四、合并具有相同属性的对象
const obj1 = { a: 1, b: 1, c: 1 };
const obj2 = { b: 2, c: 2 };
const obj3 = { c: 3 };
const obj = Object.assign({}, obj1, obj2, obj3);
console.log(obj); //{a: 1, b: 2, c: 3}
1.属性被后续参数中具有相同属性的其他对象覆盖;
2.目标对象的属性与源对象的属性相同,源对象覆盖目标的属性
五、继承属性和不可枚举属性是不能拷贝
const obj = Object.create({ son: 1 },{//son是个继承属性
obj1: {
value: 2 // obj1是个不可枚举的属性
},
obj2: {
value: 4,
enumerable: true,// obj1是个可枚举的属性
},
}
);
创建对象时,如果没有设置enumerable的值,默认为false(不可枚举属性),设置为true,则为可枚举属性
const copy = Object.assign({}, obj);
console.log(copy); //{obj2: 4}
六、原始类型会被包装为对象
const obj1 = "aa";
const obj2 = true;
const obj3 = 1;
const obj4 = Symbol("son");
const obj = Object.assign({},obj1,null,obj2,undefined,obj3,obj4);
原始类型会被包装,null和undefined会被忽略;
注意,只有字符串包装的对象才可能有自身可枚举属性
console.log(obj) //{0: "a", 1: "a"}
七、异常会打断后续拷贝任务
const target = Object.defineProperty({},"son",{
value:1,
writable:false
})//target的“son”属性是个只读属性
Object.assign(target,{obj1:2},{bother:1,son:5,sister:12},{obj2:22});
console.log(target.obj1) // 2 说明第一个源对象拷贝成功了
console.log(target.bother) // 1 说明第二个源对象的第一个属性拷贝成功了
console.log(target.son) // Cannot assign to read only property 'son' of object
// 由于son属性为只读属性不能被覆盖,所以第二个源对象的第二个属性拷贝失败了
console.log(target.sister) // undefined 异常之后assign方法就退出了,第三个属性是不会被拷贝成功的
console.log(target.obj2) // undefined 第三个源对象更是不会被拷贝成功的