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

Assigning objects in Javascript: shallow or deep copy?

本问题已经有最佳答案,请猛点这里访问。

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

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

新属性将有新的分配值或引用?如果这是一个深刻的副本,我怎么能让它被吞咽?谢谢。


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

所以…没有复制任何内容。我们可以通过将对象作为数组的元素放置,并检查以前分配的属性是否仍然可以通过新的"父"数组访问来演示这一点。

(要在注释中回答您的问题,是的,您的示例比(或javascript)要复制值时更具性能。)

1
2
3
4
5
6
7
8
9
10
'use strict';

const arrayOne = [];

arrayOne.someProperty ="This string is a property of `arrayOne`," +
                       "accessed via the reference to it in `arrayTwo`."

const arrayTwo = [arrayOne];

span.innerHTML = arrayTwo[0].someProperty;
1
<span id="span"></span>