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);
}
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);
}