我试图理解 JavaScript 中变量和对象的传递,并遇到了这个页面。
说明 JavaScript 对象是按值传递的,但值本身是一个引用。尽管我了解该页面上给出的示例中发生了什么,但我仍然对为什么感到困惑。谁能解释一下“价值本身就是参考”是什么意思?
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
它引用了一个具有a
和b
属性的对象。然后它调用该函数changeObj
并传入o
. 该函数更改a
属性的值并创建一个新c
属性 - 该函数正在修改该变量o
引用的同一对象,因为它具有对该对象的引用。但是随后该函数分配someObj
了一个全新的对象。这根本没有影响o
,因为该函数只有对o
所指向对象的引用,它无权访问o
变量本身。
与 Java、Python 和许多其他语言一样,在 JavaScript 中,对象不是值。
这意味着,当您评估一个表达式时,您从中获得的值要么是原始值,要么是引用(引用是指向对象的指针)。当您创建一个对象时,该表达式的计算结果为一个引用。当您访问对象的字段或调用对象的方法时,左边的东西是引用。基本上,您对对象所做的任何事情都必须通过对对象的引用来完成。没有直接处理对象的语法。
您不能拥有一个其值“是”一个对象的变量(与 C++ 不同,您可以同时拥有一个值为对象的变量和一个其值为指向对象的指针的变量);您只能拥有一个变量,其值是指向对象的引用。
从以下事实可以看出这一点:当您分配一个变量时,永远不会创建一个新对象。分配引用时,分配的变量具有原始引用值的副本,因此指向与原始引用相同的对象。没有任何东西可以放入变量中,导致分配它以创建新对象。
因此,如果有人说“将对象传递给函数”,我会说,不,你不能传递对象,因为对象不是值。您必须传递对对象的引用。就像在赋值中一样,当你传递一个引用时,它的值会被复制。JavaScript 始终是按值传递的。
说明 JavaScript 对象是按值传递的,但值本身是一个引用。
这是相当混乱的措辞。他们的意思是当对象被传递给函数时,指向对象的引用值被传递而不是实际的对象。