首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JavaScript阵列时,浅层拷贝和深层拷贝有什么区别?

使用JavaScript阵列时,浅层拷贝和深层拷贝有什么区别?
EN

Stack Overflow用户
提问于 2014-07-01 22:25:30
回答 2查看 17.1K关注 0票数 18

根据MDN文档,调用array.slice()将创建数组的浅拷贝。

请参阅此MDN link for slice()

但是,如果我在控制台中运行一个简单的测试:

代码语言:javascript
运行
复制
var test = [[1,2,3],7,8,9];
var shallow_copy = test.slice();

检查shallow_copy,我可以看到整个二维数组似乎都被复制了。

浅拷贝和深拷贝有什么区别?如果我猜的话,我会说这是一个深度拷贝。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-01 22:27:57

要查看不同之处,请尝试:

代码语言:javascript
运行
复制
shallow_copy[0][2] = 4;
console.dir(test);

您将看到test已被修改!这是因为虽然您可能已经将值复制到新数组中,但嵌套的数组仍然是同一个数组。

深层副本将递归地执行浅层副本,直到所有内容都是原始副本的新副本。

票数 26
EN

Stack Overflow用户

发布于 2014-07-01 22:41:47

基本上,您只是获得了对原始变量/数组的引用。更改引用也会更改原始数组。您需要遍历原始数组的值并形成一个副本。

考虑这个例子:

代码语言:javascript
运行
复制
var orig = {  a: 'A', b: 'B', c: 'C' };

假设您想创建一个副本,这样即使您更改了原始值,也可以始终返回到原始值。

我可以这样做:

代码语言:javascript
运行
复制
var dup = orig; //Shallow copy!

如果我们改变一个值:

代码语言:javascript
运行
复制
dup.a = 'Apple';

此语句还将从orig更改a,因为我们有一个浅拷贝,或对var orig的引用。这意味着,您还会丢失原始数据。

但是,通过使用原始orig变量中的属性创建一个全新的变量,您可以创建一个深度副本。

代码语言:javascript
运行
复制
var dup = { a: orig.a, b: orig.b, c: orig.c }; //Deep copy!

现在,如果您更改dup.a,它只会影响dup,而不会影响orig

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24512712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档