什么是'值是引用'表示JavaScript对象

What does 'value is a reference' mean for JavaScript objects

本文关键字:JavaScript 对象 表示 引用 什么      更新时间:2023-09-26

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

据解释,JavaScript对象是通过值传递的,但值本身是一个引用。尽管我理解那一页上给出的例子中发生了什么,但我仍然困惑于为什么。有人能解释一下"价值本身就是参考"是什么意思吗?

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

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

JS只有"pass-by-value",但当您将对象作为参数传递时,"value"是对原始对象的引用,因此函数可以修改、创建或删除该对象的属性,但函数不能修改原始变量以引用其他对象或值。

示例:

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

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

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

不能有一个值"是"对象的变量(与C++不同,在C++中,既可以有值为对象的变量,也可以有值指向对象的指针的变量);只能有一个变量,其值是指向对象的引用。

这一点很明显,因为当您指定一个变量时,永远不会创建新对象。指定引用时,指定的变量具有原始引用值的副本,因此指向与原始引用相同的对象。在变量中没有任何内容可以导致指定它来创建新对象。

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

据解释,JavaScript对象是通过值传递的,但值本身是一个引用。

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