JavaScript对象中的'value is a reference'是什么意思?

3
我试图理解JavaScript中变量和对象的传递,看到了这个页面

其中解释说JavaScript对象是按值传递的,但该值本身是一个引用。虽然我理解了该页面上给出的示例中发生的情况,但我仍然不明白为什么会这样。请问有人能够解释一下“值本身是一个引用”是什么意思吗?

重复:https://dev59.com/5nRB5IYBdhLWcg3wxZ7Y?lq=1 - aquinas
@aquinas,我在问题中提到的链接与你提到的是相同的。我的问题是关于那个页面的,所以我认为它不是重复的! :) - rgamber
3个回答

3
一些编程语言对函数参数有“按引用传递”的概念,这意味着当您调用一个函数并通过引用传递变量时,该函数可以修改原始变量以保存其他值 - 它具有对原始变量的引用。
使用“按值传递”时,当您调用一个函数并传递变量时,函数只会获取该值,因此无法更改传入的原始变量。
JS仅支持“按值传递”,但是当您将对象作为参数传递时,“值”是对原始对象的引用,使得函数可以修改、创建或删除该对象的属性,但是函数无法修改原始变量以引用其他对象或值。
例如:
function changeObj(someObj) {
    someObj.a = 1000;
    someObj.c = "test";

    someObj = { "x" : 5 };
    console.log(someObj);   // { "x" : 5 }
}

var o = { "a" : 1, "b" : 2 };
changeObj(o);
console.log(o);   // { "a" : 1000, "b" : 2, "c" : "test" }

我展示的代码创建了一个变量o,它引用具有ab属性的对象。然后调用函数changeObj并传入o。函数更改a属性的值并创建一个新的c属性 - 函数修改与变量o引用相同的对象,因为它具有对该对象的引用。但是,然后该函数将someObj分配为完全新的对象。这不会影响o,因为该函数只有对o指向的对象的引用,而没有访问o变量本身。

1
不用谢。我添加了一个示例,希望能使它更加清晰明了。 - nnnnnn

2
像Java、Python和许多其他语言一样,在JavaScript中,对象不是值
这意味着当您评估表达式时,您从中获取的值要么是原始值,要么是引用(引用是指向对象的指针)。当您创建一个对象时,该表达式会计算为一个引用。当您访问对象的字段或调用对象的方法时,左侧的内容是一个引用。基本上,您对对象进行的任何操作都必须通过对对象的引用来进行。没有直接处理对象的语法。
您不能有一个变量其值“是”对象(与C++不同,您既可以有一个值为对象的变量,也可以有一个值为指向对象的指针的变量);您只能拥有一个值为指向对象的引用的变量。
这从分配变量时不创建新对象可看出。当您分配引用时,分配的变量具有原始引用值的副本,因此指向与原始引用相同的对象。没有任何东西可以放在变量中,以使分配它创建一个新对象。
因此,如果有人说“将对象传递给函数”,我会说,不,您不能传递一个对象,因为对象不是值。您必须传递一个指向对象的引用。就像在赋值时一样,当您传递引用时,它的值被复制。JavaScript始终按值传递。

1
据解释,JavaScript对象按值传递,但该值本身是一个引用。
这种措辞相当令人困惑。他们的意思是,当对象传递给函数时,传递的是指向对象的引用值,而不是实际的对象。

3
...并且该引用是按值传递的。 - user395760
那么,在这种情况下,它与对象仅通过引用传递有何不同? - rgamber
3
把对象引用看作是一辆车的牌照号码。如果我告诉你我的车号码,你写在纸上,你就能找到我的车并开走它。如果你改变纸上的号码,它就会引用另一辆车,但是我的车仍然保留它原来的号码。 - David Harkness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接