【问题标题】:Why isn't this object being overwritten? [duplicate]为什么这个对象没有被覆盖? [复制]
【发布时间】:2015-06-18 21:01:16
【问题描述】:

给我这两个简单的例子是为了解释javascript中的对象。我理解第一个示例,但我无法理解的是为什么在第二个(高度相似)示例中 o 没有被空对象覆盖?

function foo(obj) {
    obj.x = 7;
}
var o = {x: 5};
foo(o);
console.log(o.x); // 7

在我看来,在以下示例中,应该记录 undefined:

function foo(obj){
   obj = {};
}
var o = {x: 5};
foo(o);
console.log(o.x); // 5

但不是,怎么会?这两个示例有什么区别,导致o 在第二个示例中不会被覆盖?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    在这两个示例中,您都传递了对对象的引用副本,而不是对象本身

    在示例 1 中,您更改了对象内的某些内容,很好 在函数中的示例 2 中,您更改了引用本身,它现在指向的不是原始对象,在函数之外,引用仍然相同

    这是按值传递 v 按引用传递

    【讨论】:

      【解决方案2】:

      参数obj 是一个独立于o 的变量。当函数被调用时,它会收到p 值的副本。更改obj 的值对o 没有影响。

      JavaScript 纯粹是一种按值传递的语言。无法为 JavaScript 变量创建别名,因此被调用函数无法修改调用环境中变量的值。

      【讨论】:

      • 但据我了解,javascript 通过引用(或者更具体地说,是对对象的引用的值)将对象分配给变量。这就是第一个示例有效的原因。但这是否也意味着在第二个示例中该对象将被覆盖?
      • @DrMister 没有。 ovalue 确实是一个对象的 reference。调用该函数时,会生成该引用的副本并将其移交给该函数。修改 obj 会修改不同的变量,并且不会影响 o 的值。
      【解决方案3】:

      在您的函数 foo 中,当您设置 obj = {} 时,您正在更改 obj 引用的引用。但您不会更改 o 引用的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2013-08-12
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        相关资源
        最近更新 更多