博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript中浅拷贝和深拷贝的区别和实现
阅读量:6641 次
发布时间:2019-06-25

本文共 1836 字,大约阅读时间需要 6 分钟。

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

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

基础数据类型:保存在栈内存中的简单数据段 ,有undefined,boolean,number,string,null
引用数据类型:Array,对象,Function 保存在堆内存空间中

图片描述

var a1 = 0; var a2 = 'this is str'; var 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

微信公众号:前端之攻略

发布前端与设计有关的内容,请扫描下面二维码
图片描述

转载地址:http://txovo.baihongyu.com/

你可能感兴趣的文章
浅谈 .NET 中的对象引用、非托管指针和托管指针
查看>>
[ASP.NET MVC 小牛之路]15 - Model Binding
查看>>
python3学习笔记(三):注释和字符串
查看>>
C#中的static静态变量的用法
查看>>
3大原则让你的编程之路越走越顺
查看>>
编译安装samba 3.3.3
查看>>
sqlserver move database or datafile
查看>>
校验台湾身份证号码的js脚本
查看>>
1.7---将矩阵元素为0的行列清零0(CC150)
查看>>
electron---项目打包
查看>>
杀死数据库进程
查看>>
vue-mixins使用注意事项和高级用法
查看>>
ES6 类(Class)基本用法和静态属性+方法详解
查看>>
map正序、逆序排序
查看>>
杰普oracle笔记1
查看>>
Oracle 自动生成hive建表语句
查看>>
件工程个人作业02
查看>>
poj 3592 Instantaneous Transference 【SCC +缩点 + SPFA】
查看>>
简单的WINFORM窗口,体验WINFORM带来的快感
查看>>
POJ 数学题目(转载)
查看>>