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

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

前言

要理解 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

责任编辑:庞桂玉 来源: 今日头条
相关推荐

2021-07-16 12:33:24

Javascript深拷贝浅拷贝

2018-05-10 14:20:18

前端JavaScript深拷贝

2017-08-16 13:30:05

Java深拷贝浅拷贝

2020-10-12 08:35:22

JavaScript

2021-09-27 11:07:11

深拷贝浅拷贝内存

2022-07-26 08:07:03

Python浅拷贝深拷贝

2024-04-17 09:01:08

Python深拷贝浅拷贝

2023-09-22 12:21:33

Python深拷贝浅拷贝

2009-05-19 17:28:44

深拷贝浅拷贝clone()

2020-08-03 08:24:26

原型模式拷贝

2023-05-17 08:42:46

深拷贝Golang

2020-06-23 08:41:47

JavaScript开发技术

2022-09-30 15:03:09

C语言深拷贝浅拷贝

2017-05-24 11:54:55

Javascript深拷贝

2023-05-17 07:36:00

浅拷贝深拷贝对象

2021-01-08 06:15:09

深拷贝浅拷贝写时拷贝

2022-11-07 11:37:27

深拷贝浅拷贝底层

2024-02-05 22:56:16

C++拷贝开发

2023-05-05 08:47:35

Java浅拷贝深拷贝

2023-01-05 18:14:32

浅拷贝深拷贝Python
点赞
收藏

51CTO技术栈公众号