Object.assign()是深拷贝还是潜拷贝

定义

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
🌰

var obj = {};
var o1 = { a: 1, b: 1 };
var o2 = { b: 2 };
var obj = Object.assign(obj, o1, o2);
console.log(obj); // { a: 1, b: 2 }

注意:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性

深拷贝还是潜拷贝?
  • 对象的浅拷贝:浅拷贝是对象共用的一个内存地址,对象的变化相互印象。
  • 对象的深拷贝:简单理解深拷贝是将对象放到新的内存中,两个对象的改变不会相互影响。

  1. 举例一

    var obj1 = {name: 'd'}
    var obj2 = {age: 23}
    Object.assign(obj1,obj2)
    obj2.age = 29
    console.log(obj1) // {name: "d", age: 23}
    

    上面可看出修改了obj2 的值并没有修改到目标对象,看起来是深拷贝

  2. 举例二

    var obj1 = {name: 'd'}
    var obj2 = {age: {year: 2019}}
    Object.assign(obj1,obj2)
    obj2.age.year = 2020
    console.log(obj1) // {name: "d", age: {year: 2020}}
    

    修改了obj2 的值,同时也修改到目标对象,看起来是潜拷贝

总结:对于Object.assign()而言,如果对象的属性值为简单类型(string,number),通过Object.assign({},srcobj);得到的新对象为深拷贝;如果属性值为对象或其他引用类型,那对于这个对象而言其实是浅拷贝的,这是Object.assign()特别需要注意的地方。

手写深拷贝:

function clone(target) {
    if (typeof target === 'object') {
        let cloneTarget = Array.isArray(target) ? [] : {};
        for (const key in target) {
            cloneTarget[key] = clone(target[key]);
        }
        return cloneTarget;
    } else {
        return target;
    }
};

上一篇
TypeScript 高级类型 TypeScript 高级类型
本文将介绍 交叉类型 联合类型 泛型<T> Partial Required Readonly Pick Omit 映射类型 1、交叉类型交叉类型是将多个类型合并为一个类型。把多种类型叠加到一起成为一种类型。PersonA &
2021-08-26
下一篇
BFC和IFC,GFC和FFC BFC和IFC,GFC和FFC
BFC概念BFC 即 Block Formatting Contexts (块级格式化上下文),具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素。可以把 BFC 理解为一个封闭的大箱子,箱子内部
2021-02-18 丁祖科