美文网首页
JavaScript深拷贝和浅拷贝

JavaScript深拷贝和浅拷贝

作者: wade3po | 来源:发表于2019-02-03 09:18 被阅读9次

在JavaScript中操作数据的时候,基础数据类型还好,不管是我们怎么赋值修改都不会有什么问题,但是如果我们操作的是数组或者Object,那很容易出现修改了一个值就会把所有的都给变了,这就是浅拷贝。

var obj1 = {a: 10};
var obj2 = obj1;
obj2.a = 40;
console.log(obj1);// {a: 40}
console.log(obj2);// {a: 40}

 

var arr1 = [0];
var arr2 = arr1;
arr2[0] = 5;
console.log(arr1);
console.log(arr2);

我们明明想只是修改对象或者数组中的另一个,为什么两个都改变了。这就涉及深拷贝和浅拷贝了。

浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存;
深拷贝:复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变。

这原理其实跟堆内存、栈内存、指针有关系,在这边就不讲了。

那怎么能深拷贝呢?方法很多,比如Object的assign、循环赋值新的一个对象、jQuery的extend方法等等,但是这些都复杂化了,虽然可以实现但本人不推荐。

如果是数组,那么我们用slice和concat函数,这两个函数都会返回一个新的数组,而参数只要不设置,返回的就是原本的数组。

var arr1 = [0];
var arr2 = arr1.slice(0);
arr2[0] = 5;
console.log(arr1);
console.log(arr2);

 

 

var arr1 = [0];
var arr2 = arr1.concat();
arr2[0] = 5;
console.log(arr1);
console.log(arr2);

输出的都是原来数组的。在我认为,这两个方法是最简单的数组深拷贝方法,当然也可以循环赋值一个新的数组,跟下面对象一样。

如果是对象,那我推荐转成字符串然后再转回对象。

var obj1 = {a: 10};
var obj2 = JSON.parse(JSON.stringify(obj1));
obj2.a = 40;
console.log(obj1);
console.log(obj2);

但是,如果对象里面是函数的话,这个方法是没办法把函数赋值的。

var obj1 = {a: 10, b:function () {
        alert(5);
    }};
var obj2 = JSON.parse(JSON.stringify(obj1));
obj2.a = 40;
console.log(obj1.b);
console.log(obj2.b);

Obj2.b输出undefined,没办法拷贝函数。所以对象中如果有涉及函数,一般用循环赋值进行深拷贝。

var obj1 = {a: 10, b:function () {
        alert(5);
    }};
var obj2 = {}
for(var i in obj1) {
    obj2[i] = obj1[i];
};
console.log(obj1);
console.log(obj2.b);

不仅函数可以拷贝,在修改任何一个对象的时候不会把另一个给修改了。

如果有什么指教请留言,或者有什么问题也请留言,我们会尽我们最大努力帮您解答。

欢迎关注Coding个人笔记 公众号

相关文章

  • 浅拷贝和深拷贝

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

  • 深入理解JavaScript中的堆与栈 、浅拷贝与深拷贝

    JavaScript中的浅拷贝与深拷贝 学了这么长时间的JavaScript想必大家对浅拷贝和深拷贝还不太熟悉吧,...

  • js浅拷贝和深拷贝

    javaScript的变量类型 javaScript的变量类型基本类型:引用类型: 浅拷贝和深拷贝的区分 浅拷贝浅...

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

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

  • JavaScript深拷贝、浅拷贝

    JavaScript深拷贝、浅拷贝 浅拷贝:浅拷贝只是复制了内存地址,如果原地址中的对象改变了,浅拷贝出来的对象也...

  • 初探浅拷贝&深拷贝

    思考 这个代码为什么具有深拷贝作用 浅拷贝与深拷贝 在JavaScript中,对于Object和Array这类引用...

  • 理解JavaScript中浅拷贝和深拷贝的区别

    要理解 JavaScript中浅拷贝和深拷贝的区别,首先要明白JavaScript的数据类型 JavaScript...

  • 浅拷贝和深拷贝

    今天来讨论一下javascript中的浅拷贝和深拷贝。 首先我们先来看一下两个问题: 1.什么叫浅拷贝和深拷贝? ...

  • iOS面试题-第二页

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

  • iOS - copy 与 mutableCopy

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

网友评论

      本文标题:JavaScript深拷贝和浅拷贝

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