总结Object.assign()用法

Object.assign(target,…source):用于将所有可枚举属性(enumerable: true)的值从一个或多个源对象(source)复制到目标对象(taget),并将返回目标对象。

一、Object.assign()对象的拷贝总结Object.assign()用法_第1张图片

注意
1.如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。
后面的源对象的属性将类似地覆盖前面的源对象的属性
2.Object.assign()方法只会拷贝源对象自身的且可枚举的属性到目标对象。
该方法使用源对象的[[Get]]和目标对象的[[set]],所以它会调用相关getter和setter。
因此,它分配属性,不仅仅是复制或定义新的属性。如果合并源包含getter,
这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)
复制到原型,应使用Object.getOwnPropertyDescriptor()
和Object.defineProperty()。

二、Object.assign()对象的深拷贝

针对深层拷贝,需要使用其他方法,因为Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也指向那个引用。
总结Object.assign()用法_第2张图片
总结Object.assign()用法_第3张图片
总结Object.assign()用法_第4张图片
总结Object.assign()用法_第5张图片
总结Object.assign()用法_第6张图片

三、对象的合并总结Object.assign()用法_第7张图片

在这里插入图片描述

四、合并具有相同属性的对象

    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 第三个源对象更是不会被拷贝成功的

你可能感兴趣的:(object)