• Object.assign()拷贝是深拷贝还是浅拷贝问题


    什么是深拷贝,什么是浅拷贝?

      B复制A--A变B变,浅拷贝; A变B不变,深拷贝。

    Object.assign(target, source) 方法:用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。

    它将返回目标对象。 并且目标对象也会被修改,如果不想修改目标对象,可以将目标对象改成空 {}

    let user = {name:'无敌人',age:19};
    let page = {pageSize:10,currentPage:1};
    let newObj = {};
    Object.assign(newObj,user,page);
    // newObj={name:'无敌人',age:19,pageSize:10,currentPage:1}
    Object.assign(obj1,obj2)
    obj1为主对象,obj2为被合并对象
    合并完成之后重复的键值对将被删除
    const target = { a: 1, b: 2 };
    const source = { b: 4, c: 5 };
    const returnedTarget = Object.assign(target, source);
    console.log(target); // { a: 1, b: 4, c: 5 }
    console.log(returnedTarget); // Object { a: 1, b: 4, c: 5 }
    console.log(target) // {a: 1, b: 4, c: 5}
    如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
    支持多个对象合并,如果不想修改目标对象,可以将目标对象改成空 {}, 例如:const returnedTarget
    = Object.assign( {} , source,source);

    Object.assign()拷贝:当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。

    第一级是深拷贝:
    let a = {James: {age: 18}}
    let b = Object.assign({}, a)
    b.James = 20
    console.log(b) // { James: 20 }
    console.log(a) // { James: { age: 18 } }
    以后各级是浅拷贝:
    let a = {James: {age: 18}
    let b = Object.assign({}, a)
    b.James.age = 20
    console.log(b) // { James: { age: 20 } }
    console.log(a) // { James: { age: 20 } } //源对象a也被修改

    实现深拷贝的几种方法:

    1.JSON.stringify 和 JSON.parse

    2.Object.assign()拷贝第一级是深拷贝,以后各级是浅拷贝
    3.通过jQuery的extend方法实现深拷贝
    4.lodash.cloneDeep()实现深拷贝
    let _ = require('lodash'); 
    let obj1 = { a: 1, b: { f: { g: 1 } }, c: [1, 2, 3] };
    let obj2 = _.cloneDeep(obj1);
  • 相关阅读:
    Spring 由哪些模块组成?
    spring 支持哪些 ORM 框架 ?
    @Autowired 注解有什么用?
    spring JDBC API 中存在哪些类?
    有哪些类型的通知(Advice)?
    @Component, @Controller, @Repository, @Service 有何区别?
    @Qualifier 注解有什么用?
    什么是 Aspect?
    什么是通知(Advice)?
    spring bean 容器的生命周期是什么样的?
  • 原文地址:https://www.cnblogs.com/huxiuxiu/p/13658071.html
Copyright © 2020-2023  润新知