为什么 javascript 通过引用传递对象?

Why does javascript pass objects by reference?

我想知道这背后是否有理由,因为在我看来,如果将对象作为值传递,它会更加面向对象。实际上,它将是对象的函数作用域,就像基元一样。

对象通过引用传递只是为了优化目的吗?


参考:http://snook.ca/archives/javascript/javascript_pass

我们路过什么?

Java脚本不通过引用传递对象。它passes objects by reference values like C# and Java。 Java脚本总是按值传递 - 该值可能恰好是对对象的引用。

function foo(obj){
   obj = {};
}
var o = {x: 5};
foo(o);
console.log(o.x); // 5, proof that JavaScript is pass-by-value

例如,在 C++ 中:

void foo(int& i){
    i = 5; 
}
int j = 10;
foo(j);
std::cout << j; // logs 5, this is what pass-by-reference is

Java脚本中的基元值,通过引用传递它们是没有意义的,因为作为值它们无论如何都是不可变的(你不能更改 数字 5).

但是数值要好很多!

我同意,值具有更好的语义。您不能 return 将从未知位置错误修改的值。它更清晰,事实证明它很容易优化。一般来说,不可变性在 JavaScript 中获得了很大的动力,很多人(包括我在内)都在使用不可变集合(比如 ImmutableJS)。请注意,非原始值类型 已计划 但目前正在规范中,不会在 ES7 之前到达。

这是 the only reference 我可以找到它,我没有在讨论邮件列表中看到它的讨论,但我希望它在路上:)

基本上,我们可以有效地做到这一点的理解比 JavaScript 更新得多。 Java脚本是一种非常有趣的语言,但请记住,它是由一个人在 10 天内紧急设计的。像价值对象这样的好东西正在路上,但我们必须处理我们现在拥有的东西。如果它能让你感觉更好,很多其他语言也会这样做(比如 Scala、Java 和 C#)。