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