美文网首页
JS深拷贝与浅拷贝总结

JS深拷贝与浅拷贝总结

作者: TerryMin00 | 来源:发表于2019-12-01 17:40 被阅读0次

JS数据类型思维导图:

深拷贝与浅拷贝是针对引用数据类型而言,可分下面几种:

一 JSON.parse(JSON.stringify)深拷贝的局限

1 可以用这个技巧进行数据对象或数组的拷贝

2 如果被拷贝的对象中有function,则拷贝之后的对象就会丢失这个function

3 如果被拷贝的对象中有正则表达式,则拷贝之后的对象正则表达式会变成Object

4 好文你所不知道的JSON.stringify

二 返回一个数组或者对象的浅拷贝:  Array.prototype.slice()和Array.prototype.concat();ES6数组的解构赋值

var o1 = ['darko', {age:22}];

var o2 = o1.slice();// 根据Array.prototype.slice()的特性,这里会返回一个o1的浅拷贝对象

console.log(o1 === o2);// => false,说明o2拷贝的是o1的一个实例

o2[0] ='lee';

console.log(o1[0]);// => "darko" o1和o2内部包含的基本类型值,复制的是其实例,不会相互影响

o2[1].age =23;

console.log(o1[1].age);// =>23 o1和o2内部包含的引用类型值,复制的是其引用,会相互影响

三 深浅拷贝实现:

1 浅拷贝实现:

  function shallowClone(source) {

    if (!source || typeof source !== 'object') {

      throw new Error('error arguments');

    }

    var targetObj = source.constructor === Array ? [] : {};

    for (var keys in source) {

      if (source.hasOwnProperty(keys)) {

        targetObj[keys] = source[keys];

      }

    }

    return targetObj;

  }

2 深拷贝实现:

function deepClone(source){

  if(!source || typeof source !== 'object'){

    throw new Error('error arguments', 'shallowClone');

  }

  var targetObj = source.constructor === Array ? [] : {};

  for(var keys in source){

      if(source.hasOwnProperty(keys)){

        if(source[keys] && typeof source[keys] === 'object'){

          targetObj[keys] = source[keys].constructor === Array ? [] : {};

          targetObj[keys] = deepClone(source[keys]);

        }else{

          targetObj[keys] = source[keys];

        }

      }

  }

  return targetObj;

}

// test example

var o1 = {

  arr: [1, 2, 3],

  obj: {

    key: 'value'

  },

  func: function(){

    return 1;

  }

};

var o3 = deepClone(o1);

console.log(o3 === o1); // => false

console.log(o3.obj === o1.obj); // => false

console.log(o2.func === o1.func); // => true

相关文章

  • JS中的深拷贝与浅拷贝

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

  • js浅拷贝深拷贝

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

  • 浅拷贝和深拷贝

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

  • JS深拷贝与浅拷贝总结

    JS数据类型思维导图: 深拷贝与浅拷贝是针对引用数据类型而言,可分下面几种: 一 JSON.parse(JSON....

  • 知识点总结(1)

    1.深拷贝与浅拷贝 举例 总结: 只有第一种情况是浅拷贝第四种情况有可能地址相同,但是也是深拷贝深拷贝:拷贝指针和...

  • js面试题

    1,js的深拷贝与浅拷贝 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,...

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

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

  • JS中对象的复制

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

  • 认识js下的浅拷贝与深拷贝

    浅拷贝与深拷贝 首先深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的。简单来说,浅拷贝只拷贝一...

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

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

网友评论

      本文标题:JS深拷贝与浅拷贝总结

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