javascript 中按值传递和按引用传递究竟是如何工作的?

How exactly is does pass by value and pass by reference work in javascript?

我一直在阅读 javascript 中关于按值传递与按引用传递的内容,我读到 JavaScript 总是按值传递,仅对于非原始类型,该值是一个地址在记忆中。但是原始类型不也是这样吗?原始类型不是也存储在内存中并且分配给它们的变量也需要指向它们的位置吗? 我将使用这个 table 来尝试解释我在说什么。

Variable Address Value
a 0x01 10
b 0x02 10
c 0x03 [1, 2]
d 0x03 [1, 2]

当变量'b'赋值给'a'(b=a)的值时,复制'a'(10)地址处的值,这个副本就是放置在内存中的不同位置,新地址分配给 'b'?

当 d = c 时,变量 d 不是复制 'c' 地址处的值,而是被赋予与 c 相同的地址 - 它们现在都指向内存中的相同位置存储数组 [1, 2]?

table 准确还是...?

谢谢。

当您声明变量时,JavaScript 引擎会在两个内存位置为它们分配内存:stackheap

静态数据是编译时大小固定的数据。静态数据包括:

  • 原始值(空值、未定义、布尔值、数字、字符串、符号和 BigInt)
  • 引用对象的引用值。

因为静态数据的大小是不变的,所以JavaScript引擎为静态数据分配固定数量的内存space并将其存储在堆栈中。

例如,下面声明了两个变量并将它们的值初始化为文字字符串和数字:

let name = 'John';
let age = 25;

因为name和age是原始值,JavaScript引擎将这些变量存储在栈中,如下图所示:

与堆栈不同,JavaScript 在堆上存储对象(和函数)。 JavaScript 引擎不会为这些对象分配固定数量的内存。相反,它将根据需要分配更多 space。

以下示例定义了姓名、年龄和人员变量:

let name = 'John';
let age = 25;

let person = {
  name: 'John',
  age: 25,
};

在这张图中,JavaScript为name、age、person三个变量在栈上分配内存。

JavaScript 引擎在堆内存上创建一个新对象。此外,它将堆栈内存中的 person 变量链接到堆内存中的对象。

因此,我们说 person 变量是引用对象的引用。

Please check here for details