'值是一个引用'对JavaScript对象意味着什么

时间:2012-08-19 22:08:21

标签: javascript pass-by-reference pass-by-value

我试图了解JavaScript中变量和对象的传递,并遇到this page

解释了JavaScript对象是按值传递的,但值本身是一个引用。虽然我理解该页面上给出的例子中发生了什么,但我仍然感到困惑。任何人都可以解释一下“价值本身是一个参考”是什么意思吗?

3 个答案:

答案 0 :(得分:3)

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

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

JS只有“按值传递”,但是当您将对象作为参数传递时,“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变量本身。

答案 1 :(得分:2)

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

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

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

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

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

答案 2 :(得分:1)

  

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

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