JS按引用推送对象的原因是什么?

What is the reason why JS push objects by reference?

Javascript 按引用而不按值推送对象的原因是什么?

为什么这种行为只适用于对象而不适用于内置基元类型?

例如:

let x = {a: 10, b: 100 }
let ar = [];

ar.push(x);
x.a = 9;
console.log(ar[0].a); // This print 9, not 10

我认为这个问题的答案有助于理解关于这门语言的一些深层功能。

提前致谢。

JavaScript 中的所有内容均按值传递...

但是,这些值可以作为参考值。

差异看似微妙,但非常重要。

例如,如果你有一个函数:

function nukeArray(a) {
  a = [];
}

然后,当您调用它时,a 将收到一个恰好是引用的值。该值立即被丢弃,并为 a 分配一个新的引用。

如果 a 是纯引用,那么更改 a 也会更改其调用者的值。

在像 C 这样的语言中,您可以轻松地传递引用——更改引用——然后调用者的值也会更改。

#include <stdio.h>
#include <stdlib.h>

void t(char **t) {
    *t = malloc(50);
}

int main() {
    char *tmp;
    printf("pre: %p\n", tmp);
    t(&tmp);
    printf("post: %p\n", tmp);
}