美文网首页
浅复制深拷贝

浅复制深拷贝

作者: 他在发呆 | 来源:发表于2016-12-28 22:27 被阅读0次

了解之前,首先要知道什么是值类型和应用类型

  • 常见的值类型有:数值、布尔值、null、undefined。
  • 常见的引用类型有:对象、数组、函数。

用代码来详细理解

var arr1=[1,2,3,4];
var arr2=arr1;
arr1.push(5)
console.log(arr1);//1,2,3,4,5
console.log(arr2);//1,2,3,4,5

这里只改变了arr1,而arr2的值也改变了,这是因为定义arr1时,创建了一个空间,并且arr1指向它,再定义一个arr2,如果让arr2=arr1,就相当于把arr2也指向了arr1所指向的空间,所以改变arr1或arr2都可以改变这个空间里面的值,这就是引用类型。如果var arr2=[],让他等于一个新的数组,就会定义一个新的空间,而把arr2=arr1再次写进去时,相当于把arr1的指向有赋给了arr2,所以有变成上面的样子。仅个人理解。

有什么方法能让arr2==arr1&&arr2和arr1不会相互影响?

var arr1=[1,2,3,4,5];
var arr2=copy(arr1);
function copy(arr){
    var arrs=[];
    for(let i=0;i<arr.length;i++){
        arrs.push(arr1[i])
    }
    return arrs
}

这样就可以实现想要的功能;

下面,如果是一个对象,对象里面有数组,实现上面相同的功能

    var obj = { a:1, arr: [2,3] };
    var shadowObj = shadowCopy(obj);

    function shadowCopy(src) {
      var dst = {};
      for (var prop in src) {
      console.log(src.hasOwnProperty(prop))//判断src里面有没有这个属性
        if (src.hasOwnProperty(prop)) {

          dst[prop] = src[prop];
        }
      }
      return dst;
    }

改变obj,看shadowObj是否会发生变化
obj.name="小明"
console.log(obj);// { a:1, arr: [2,3],name:'小明' }
console.log( shadowObj );// { a:1, arr: [2,3] }


虽然看着的确是实现了功能,但是里面的数组还是有问题的;

obj.arr[0]=9;
console.log(obj.arr[0]);//9
console.log(shadowObj.arr[0]);//9

这是因为在遍历复制时,把数组对象直接的指向复制进去,所以这里的对象还是引用类型,如果需要的话,可以在上面代码的基础上面做判断

if(prop==arr){
    for(){
        把数组再遍历一遍
    }
}


相关文章

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • 17.是否了解 深拷贝 和 浅拷贝 的概念,集合类深拷贝如何实现

    深拷贝内存拷贝 浅拷贝指针拷贝 浅拷贝 深拷贝 集合的浅复制 (shallow copy) 集合的浅复制有非常多种...

  • 面试题iOS

    面试blog 1、深拷贝浅拷贝:浅拷贝就是拷贝对象的指针,而不复制引用对象本身;深拷贝就是拷贝引用对象本身;浅复制...

  • 浅拷贝和深拷贝

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

  • 前端笔记(二) 对象的深浅拷贝,函数的防抖与节流,函数柯里化 ,

    对象的深浅拷贝 对象的深拷贝与浅拷贝的区别: 浅拷贝:仅仅复制对象的引用, 而不是对象本身。 深拷贝:把复制的对象...

  • 浅拷贝与深拷贝

    拷贝 拷贝就拷贝 分什么浅深呀浅拷贝: 我就帮到你复制基本类型跟复制对象的地址 我就只能到这了深拷贝:那要是复制后...

  • 浅拷贝、深拷贝的方法和区别

    浅拷贝:B复制了A,当修改A时,B跟着变。深拷贝:B复制了A,当修改A时,B没变化。 浅拷贝: 深拷贝:(方法二比...

  • JAVA 深拷贝 浅拷贝

    JAVA 深拷贝 浅拷贝 浅拷贝只是复制了引用, 这个引用还是指向原来的值 深拷贝那就是直接复制了整个Object...

  • iOS全解11:特殊问题

    1、浅拷贝和深拷贝的区别? 浅拷贝:只复制指向对象的指针,指针指向同一个地址,而不复制引用对象本身。深拷贝:复制引...

网友评论

      本文标题:浅复制深拷贝

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