美文网首页
JS深拷贝浅拷贝

JS深拷贝浅拷贝

作者: majun00 | 来源:发表于2018-11-28 14:29 被阅读0次

浅拷贝和深拷贝的区别

假设 B 复制了 A,当修改 A 时,看 B 是否会发生变化,如果 B 也跟着变了,说明这是浅拷贝,如果 B 没变,那就是深拷贝。本质就是浅拷贝拷贝的是引用数据类型的引用地址。

实现浅拷贝: 赋值

实现深拷贝

  1. 一层深拷贝

看到有很多博客误导是深拷贝,注意以下方法只深复制了基本类型数据类型,即只深拷贝了一层,不是真正意义的深拷贝!!!

1. 扩展运算符: `[...arr]` `{...obj}`
2. `arr.slice()`
3. `arr.concat()`
4. `Array.from(arr)`
5. `Object.assign({}, obj)`
  1. JSON.parse(JSON.stringify(obj))
    缺点: 当值为 undefined、function、symbol 会在转换过程中被忽略

  2. 递归

function deepCopy(obj) {
      var result = Array.isArray(obj) ? [] : {};
      for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
          if (typeof obj[key] === 'object') {
            result[key] = deepCopy(obj[key]);   //递归复制
          } else {
            result[key] = obj[key];
          }
        }
      }
      return result;
    }
  1. jq 的 extend 方法
    $.extend(true,{},obj)
    缺点: 依赖 jquey 库

  2. lodash 的_.cloneDeep 方法
    _.cloneDeep(obj)

实例

let arr = [[1, 2], 1, 2, 3, 4];

// let newArr = arr; // 浅拷贝
let newArr = [...arr]; // 一层深拷贝
// let newArr = arr.slice(); // 一层深拷贝
// let newArr = arr.concat(); // 一层深拷贝
// let newArr = Array.from(arr); // 一层深拷贝
// let newArr = deepCopy(arr); // 深拷贝

newArr[0][0] = 10;
newArr[1] = 20;
// console.log(arr, newArr);

let obj = { body: { a: 10 }, b: 1 };

// let newObj = obj; //浅拷贝
let newObj = {...obj}; // 一层深拷贝
// let newObj = Object.assign({}, obj); // 一层深拷贝
// var newObj = JSON.parse(JSON.stringify(obj)); // 深拷贝
// let newObj = deepCopy(obj); // 深拷贝

newObj.body.a = 20;
newObj.b = 2;
console.log(obj, newObj);

function deepCopy(obj) {
    var result = Array.isArray(obj) ? [] : {};
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (typeof obj[key] === 'object') {
                result[key] = deepCopy(obj[key]); //递归复制
            } else {
                result[key] = obj[key];
            }
        }
    }
    return result;
}

相关文章

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • 浅拷贝和深拷贝

    本文参考:JavaScript中的浅拷贝和深拷贝js 深拷贝 vs 浅拷贝深入剖析 JavaScript 的深复制...

  • JS实现深拷贝、instanceof、判断是否为数组

    JS深拷贝 JS中拷贝对象可以按照拷贝的程度可以分为浅拷贝和深拷贝,有些时候我们需要拷贝之后的对象和拷贝之前的对象...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • 2020前端高频面试题总结(附答案)

    [ js基础题 ] 1. new的实现原理是什么? 2. 深拷贝和浅拷贝的区别是什么 深拷贝 浅拷贝 3. bin...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • JS 浅拷贝深拷贝

    浅拷贝 Object.assign Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象...

网友评论

      本文标题:JS深拷贝浅拷贝

      本文链接:https://www.haomeiwen.com/subject/klyaqqtx.html