【问题标题】:Why does javascript pass objects by reference?为什么javascript通过引用传递对象?
【发布时间】:2015-06-18 17:56:28
【问题描述】:

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

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


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

【问题讨论】:

  • 这与大多数(如果不是全部)OOP 语言没有区别。为什么传值会更OO?
  • 如果你开始按值传递,这意味着克隆对象。如果需要克隆一棵大树,这可能是一项非常昂贵的操作
  • 可能是因为每次通过对象时都必须对对象进行深度克隆?
  • @JamesThorpe 公平地说 - 很多时候你可以移动它而不是实际克隆它 - C++ 做到了(移动语义),它通常会带来非常好的性能。
  • @X.L.Ant 因为将全局对象分配给局部变量并不意味着对局部变量(即引用)的更改实际上是对全局对象的更改。然后它们将是对全局对象的本地克隆的更改。因此,本地和全局之间会有明显的区别。

标签: javascript scope


【解决方案1】:

我们路过什么?

JavaScript 不通过引用传递对象。 passes objects by reference values 就像 C#Java。 JavaScript 总是按值传递 - 该值可能恰好是对对象的引用。

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

JavaScript 中的基元 值,通过引用传递它们将毫无意义,因为作为值,它们无论如何都是不可变的(你不能更改数字 5)。

但价值观要好得多!

我同意,值的语义要好得多。您不能返回将错误地从未知位置修改的值。它更清晰,事实证明它很容易优化。总体而言,不可变性在 JavaScript 中获得了很大的发展势头,很多人(包括我在内)都在使用不可变集合(比如 ImmutableJS)。请注意,非原始值类型是计划中的,但目前正在规范中,不会在 ES7 之前到达。

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

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

【讨论】:

  • 如果您使用 C++ 定义的引用,这在技术上是准确的。我认为它实际上并没有解决 OP 的问题
  • 没有引用的“C++ 定义”,它是一个单一的定义。引用意味着非常明确的定义:传递对对象的引用而不是值。 JavaScript 确实在您调用函数时复制一个值 - 该值是对对象的引用。
  • 谢谢,不错,已修复。
  • @BenjaminGruenbaum 我确实说过,从技术上讲,它对于支持引用的语言是正确的。但是,在 Java、C# 和 JavaScript 中,不存在该概念,并且正如您所说,它传递值引用。
猜你喜欢
  • 2012-07-16
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多