zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    SLAM+语音机器人DIY系列:(二)ROS入门——3.在ubuntu16.04中安装ROS kinetic
    SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构
    2017年 年计划
    125. Valid Palindrome
    一道多树递归面试题
    顺序表查找和有序表查找
    c++中常见概念、关键字等的区别
    两个栈实现一个队列,两个队列实现一个栈
    150. Evaluate Reverse Polish Notation
    堆排序
  • 原文地址:https://www.cnblogs.com/huxiuxiu/p/13658071.html
Copyright © 2011-2022 走看看