JavaScript中浅拷贝和深拷贝的区别和实现


声明:本文转载自https://my.oschina.net/u/2612473/blog/2208441,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

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

JavaScript有两种数据类型,基础数据类型和引用数据类型

基础数据类型:保存在栈内存中的简单数据段 ,有undefined,boolean,number,string,null

引用数据类型:Array,对象,Function  保存在堆内存空间中

a1 = 0;a2 = 'this is str';a3 = null 存放在栈内存中

var c =[1,2,3] 与 var d = {m:20} 变量名与内存地址存储在栈内存中,[1,2,3]与{m:20} 作为对象存储在堆内存中

基础数据类型的复制(如var a = 20   var b = a)

引用数据类型的复制 ( var m ={a:10, b:20} var n = m)

m与n指向同一个退内存空间,当m或者n改变对象时,另一个也跟着改变

如m.a = 80  ;  console.log(n.a)   // 80

怎么样使引用数据类型有各自独立的内存空间

一、采用递归的方法复制拷贝对象

    function deepclone(obj) {
        let objClone = Array.isArray(obj) ? [] : {};
        if (obj && typeof obj === "object") {
            for (key in obj) {
                //if (obj.hasOwnProperty(key)) {   //也可以不加
                    if (obj[key] && obj[key] === "object") {
                        objClone[key] = deepclone(obj[key])
                    } else {
                        objClone[key] = obj[key]
                    }
                //}
            }
        }
        return objClone
    }
    var a = [1, 2, 3, 4];
    var b = deepclone(a);
    a[0] = 8
    console.log(a, b);

   Array.isArray(obj):ECMAScript 5.1 (ECMA-262)   考虑到的兼容性,可以用下面的方法实现较好的兼容
   if (!Array.isArray) {
      Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
     };
}

二、用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。

   function deepclone(obj){
      var _obj = JSON.stringify(obj);
      var cloneObj = JSON.parse(_obj);
      return cloneObj
    }
    var a =[1,2,3,4];
    var b= deepclone(a);
    a[0]=8
    console.log(a,b);
    //可以用JSON.stringify与JSON.parse实现深拷贝的元素是JSON.stringify(obj)转换成字符串,变成基本数据类型,基本类型拷贝是直接在栈内存新开空间,直接复制一份名-值,不影响之前的对象

总结:

浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存;   

深拷贝(deep copy):复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变;实现深拷贝主要有2种方法

(1)递归

(2)JSON.stringify结合JSON.parse

本文发表于2018年09月25日 16:00
(c)注:本文转载自https://my.oschina.net/u/2612473/blog/2208441,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1732 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1