在Javascript中分配对象:浅拷贝还是深拷贝?

在Javascript中分配对象:浅拷贝还是深拷贝?,javascript,Javascript,我想知道javascript在复制对象时是进行浅复制还是深度复制 const a = ['value1', 'value2']; const b = ['value3', 'value4']; const new_ab = [a, b]; 新的_ab将有新的分配值或引用?如果它是一个深拷贝,我怎样才能使它被吞下?谢谢。正如评论中所提到的,JavaScript完全在引用上运行,唯一的例外是原始值保留在堆栈上,因此程序不需要引用来访问它们。在您的示例中,所有变量声明都会创建新值—每个值都是数组的实

我想知道javascript在复制对象时是进行浅复制还是深度复制

const a = ['value1', 'value2'];
const b = ['value3', 'value4'];
const new_ab = [a, b];

新的_ab将有新的分配值或引用?如果它是一个深拷贝,我怎样才能使它被吞下?谢谢。

正如评论中所提到的,JavaScript完全在引用上运行,唯一的例外是原始值保留在堆栈上,因此程序不需要引用来访问它们。在您的示例中,所有变量声明都会创建新值—每个值都是数组的实例—但是声明数组返回的是引用,而不是数组本身。例如,
[1,2]
是一个值(整数)数组,但
[a,b]
是一个引用数组

所以不复制任何内容。我们可以通过将一个对象作为数组的元素放置,并检查以前指定的属性是否仍然可以通过新的“父”数组访问来演示这一点

(要回答您在评论中提出的问题,是的,您的示例比您(或JavaScript)复制值的效果更好。)

“严格使用”;
常数数组=[];
arrayOne.someProperty=“此字符串是'arrayOne'的属性”+
“通过在'arrayTwo'中对它的引用访问。”
常数arrayTwo=[arrayOne];
span.innerHTML=arrayTwo[0].someProperty

a
b
是对数组的引用,因此
new\u ab
将是对包含这些引用的数组的引用。在您发布的代码中根本没有复制对象。您可以通过变异
new_ab[0]
并查看
a
发生了什么来检查这一点。因此,使用上述代码是非常有效的,因为它们只是引用?“唯一的例外是原始值保留在堆栈上,因此程序不需要引用“你怎么知道的?你能参考说明书吗?还有,这将如何处理闭包呢?@FelixKling不是所有的原语值都存储在堆栈上。处理这些值的方式是一种简单的方法。当闭包需要一个原语值时,编译器将把该值放在堆上。参考文献是和,尽管我没有阅读v8的源代码,但只有一些轶事诚然,我对引用的语句持开放态度,但是在堆栈上存储原语值的原则适用于许多OOP语言。当强制和其他类似的操作发生时,或者如您所说,闭包中引用了一个值,那么这个原则可能会被颠覆。这基本上是我的观点:这是一个实现细节,通常不是真的,因此该语句不是正确的。这也与IMO的问题无关。@FelixKling Fair。我觉得这是一个有趣的消息!