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

栏目: JavaScript · 发布时间: 7年前

内容简介:要理解 JavaScript中浅拷贝和深拷贝的区别,首先要明白JavaScript的数据类型。JavaScript有两种数据类型,基础数据类型和引用数据类型。1. 基础数据类型: undefined、boolean、number、string、null,保存在栈内存中的简单数据2. 引用数据类型:Array、对象、Function,保存在堆内存空间中

前言

要理解 JavaScript中浅拷贝和深拷贝的区别,首先要明白JavaScript的数据类型。JavaScript有两种数据类型,基础数据类型和引用数据类型。

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

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

概述

如下图:

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

注释:

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;

如下图:

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

引用数据类型的复制

var m ={ a:10, b:20};

var n = m;

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

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

m.a = 'web秀';

console.log(n.a);

// 输出 web秀

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

深度拷贝方法

采用递归的方法拷贝对象

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

## 奇技淫巧

利用**基础数据类型**方式,把对象转换成字符串,进行复制。具体点说就是,用JSON.stringify与JSON.parse实现深拷贝。原因是JSON.stringify(obj)转换成字符串,变成基本数据类型,基本类型拷贝是直接在栈内存新开空间,直接复制一份名-值,不影响之前的对象。请看代码:

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

总结

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

2. 深拷贝(deep copy):复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变;

实现深拷贝主要有2种方法

(1)递归

(2)JSON.stringify结合JSON.parse

【责任编辑:庞桂玉 TEL:(010)68476606】


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序算法与技巧精选

程序算法与技巧精选

郭继展 / 2008-5 / 36.00元

《信息科学与技术丛书•程序算法与技巧精选》分17章,139个例题。书中介绍的算法和技巧涉及到随机数函数理论,基础数论,新意幻方,提高程序运行速度和精度,特定数据排序,穷举、递推、递归和迭代等诸多方面。这些算法和技巧大多是作者历年从事教学、软件开发、学术研究和学习的成果总结。 《信息科学与技术丛书•程序算法与技巧精选》内容不涉及计算机专业课程的诸多概念、理论,读者只需要学过C语言,有算法、结构......一起来看看 《程序算法与技巧精选》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具