欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

总结Object.assign()用法

程序员文章站 2022-04-04 23:29:49
...

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

一、Object.assign()对象的拷贝总结Object.assign()用法

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

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

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

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

相关标签: object