JavaScript 对象的“值是引用”是啥意思

Posted

技术标签:

【中文标题】JavaScript 对象的“值是引用”是啥意思【英文标题】:What does 'value is a reference' mean for JavaScript objectsJavaScript 对象的“值是引用”是什么意思 【发布时间】:2012-08-15 08:31:24 【问题描述】:

我试图理解 javascript 中变量和对象的传递,结果遇到了this page。 说明 JavaScript 对象是按值传递的,但值本身是一个引用。尽管我了解该页面上给出的示例中发生了什么,但我仍然对为什么感到困惑。谁能解释一下“价值本身就是参考”是什么意思?

【问题讨论】:

复制:***.com/questions/518000/… @aquinas,我在问题中提到的链接与您所说的相同。我的问题是关于那个页面的,所以我相信它不是重复的! :) 【参考方案1】:

与 Java、Python 和许多其他语言一样,在 JavaScript 中,对象不是值

这意味着,当您评估一个表达式时,您从中获得的值要么是原始值,要么是引用(引用是指向对象的指针)。当您创建一个对象时,该表达式的计算结果为一个引用。当您访问对象的字段或调用对象的方法时,左边的东西是引用。基本上,您对对象所做的任何事情都必须通过对对象的引用来完成。没有直接处理对象的语法。

你不能有一个值“是”一个对象的变量(与 C++ 不同,你可以同时拥有一个值为对象的变量和一个值为指向对象的指针的变量);你只能有一个变量,其值是指向一个对象的引用。

从以下事实可以看出这一点:当您分配一个变量时,永远不会创建一个新对象。分配引用时,分配的变量具有原始引用值的副本,因此指向与原始引用相同的对象。没有任何东西可以放入变量中导致分配它以创建新对象。

所以如果有人说“将对象传递给函数”,我会说,不,你不能传递对象,因为对象不是值。您必须传递对对象的引用。就像在赋值中一样,当你传递一个引用时,它的值会被复制。 JavaScript 始终是按值传递的。

【讨论】:

【参考方案2】:

一些语言对函数参数有“通过引用传递”的概念,这意味着当你调用一个函数并传入一个变量通过引用函数可以修改原始变量以保存其他值- 它引用了原始变量。

当您调用函数并传入变量时,使用“按值传递”,函数只能获取值,因此无法更改传入的原始变量。

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 变量本身。

【讨论】:

不客气。我添加了一个示例,(我希望)让它更加清晰。【参考方案3】:

说明JavaScript对象是按值传递的,但值本身是一个引用。

这是相当令人困惑的措辞。他们的意思是当对象被传递给函数时,指向该对象的引用值被传递而不是实际的对象。

【讨论】:

...并且该引用是按值传递的。 好吧,那么,它与只是通过引用传递的对象有什么不同呢? 谢谢。我想我现在明白了。 将对象引用想象为车牌号。如果我告诉你你写在一张纸上的我的车号,你就可以找到我的车并驾驶它。如果您更改纸上的号码,它将引用另一辆车,但我的车将保留其原始号码。

以上是关于JavaScript 对象的“值是引用”是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

“var FOO = FOO || ”(将变量或空对象分配给该变量)在Javascript中是啥意思?

“var FOO = FOO || ”(将变量或空对象分配给该变量)在Javascript中是啥意思?

javascript中new是啥意思

javascript里的arguments是啥意思??

javascript中new是啥意思

javascript基础部分三大核心是啥意思?