doubleyong
管理员
管理员
  • 最后登录2026-05-10
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:7464回复:1

[Javascript]Object.assign 是浅拷贝还是深拷贝?

楼主#
更多 发布于:2021-02-03 13:21
面试题:

题目:Object.assign 是浅拷贝还是深拷贝?
     

考点:对于Object.assign 方法的理解,扩展:其实可以进行实现深拷贝的方法

参考:Object.assign ()方法详解,请点击

答案:当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝


如以下对象:
let obj1 = {
   a: 1,
   b: {
     f: {
       g: 1
     }
   },
   c: [1, 2, 3]
};


那上面这种有多层对象嵌套的,如何进行深拷贝呢?


1、使用JSON.stringify 和 JSON.parse用 JSON.stringify 把对象转换成字符串,再用 JSON.parse 把字符串转换成新的对象。
注:可以转成 JSON 格式的对象才能使用这种方法,如果对象中包含 function 或 RegExp 这些就不能用这种方法了


2、通过jQuery的extend方法实现深拷贝


let $ = require('jquery');
let obj1 = {
   a: 1,
   b: {
     f: {
       g: 1
     }
   },
   c: [1, 2, 3]
};
let obj2 = $.extend(true, {}, obj1);


3、
lodash.cloneDeep()实现深拷贝



let _ = require('lodash');
let obj1 = {
    a: 1,
    b: { f: { g: 1 } },
    c: [1, 2, 3]
};
let obj2 = _.cloneDeep(obj1);


4、使用递归的方式实现深拷贝



function _deepClone(source) {
  let target;
  if (typeof source === 'object') {
    target = Array.isArray(source) ? [] : {}
    for (let key in source) {
      if (source.hasOwnProperty(key)) {
        if (typeof source[key] !== 'object') {
          target[key] = source[key]
        } else {
          target[key] = _deepClone(source[key])
        }
      }
    }
  } else {
    target = source
  }
  return target
}


参考:
https://www.jianshu.com/p/1b212581a8d5
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号