Javascript 通过参数传递散列
我对散列作为参数传递给函数有点困惑。 我知道,当一个变量通过一个参数传递给函数时,它会应用一个值的副本。 但这对于散列是无效的,至少不总是如此。 例如: 那么,为什么引用有时会用于散列呢?Javascript 通过参数传递散列,javascript,variables,Javascript,Variables,我对散列作为参数传递给函数有点困惑。 我知道,当一个变量通过一个参数传递给函数时,它会应用一个值的副本。 但这对于散列是无效的,至少不总是如此。 例如: 那么,为什么引用有时会用于散列呢? 有人能解释一下javascript在这种情况下是如何工作的吗?javascript是通过引用传递的。总是。赋值更改名称以引用某个值 所以 名称h是函数的一个参数。赋值仅影响名称h,并且该名称仅存在于函数调用的范围内 相反,语句h.b=“bar”未分配给名称h。它分配给对象中由名称h引用的b字段,这是因为Jav
有人能解释一下javascript在这种情况下是如何工作的吗?javascript是通过引用传递的。总是。赋值更改名称以引用某个值 所以 名称
h
是函数的一个参数。赋值仅影响名称h
,并且该名称仅存在于函数调用的范围内
相反,语句
h.b=“bar”代码>未分配给名称h
。它分配给对象中由名称h
引用的b
字段,这是因为JavaScript按值传递参数。
按值传递参数类似于将形式参数值分配给实际参数。例如,考虑
function f(obj) { obj.a = 10; }
o = { a : 20 };
f(o);
上述代码的工作原理与将o
的值分配给obj
类似
o = { a : 20 }
obj = o;
obj.a = 10;
console.log(o.a);
你会看到同样的效果
请参阅详细说明您的问题的简单答案是复制了一个值--a
不包含任何对象(您称之为哈希),但实际上包含对该对象的引用,并且该引用被复制到参数local中
请阅读下面关于为什么会发生这种情况的更详细解释,通过值传递与通过引用传递
在JavaScript中,变量不包含对象,而是包含对对象的引用。这是一个重要的区别
在JavaScript中,所有参数都是按值传递的。存储在变量中的对象引用按值传递
这两种行为结合起来会导致您看到的特定行为。让我们列出每个传递行为的一些示例,以证明JavaScript按值传递参数
如果对象按值传递,则b.bar
仍将为1,但在JavaScript中并非如此
如果(a)对象引用按值传递,或者(b)参数本身按值传递,则b.bar
将为2
所以在本例中,“按值传递引用”和“按引用传递参数”在行为上没有区别。现在让我们介绍一个不同的案例
function foo(a) {
a = { bar: 2 };
}
var b = { bar: 1 };
foo(b);
如果对象按值传递,则b.bar将为1,但实际情况并非如此
如果对象引用按值传递,则b.bar也将为1,这就是所发生的情况
如果参数通过引用传递,b.bar
将为2
总之,你必须意识到两件事:
作为旁注,如果对象是可以直接存储在变量中的值,那么
{}=={}
将是正确的,但事实并非如此——因为引用被比较并发现不相等,因为这些引用引用引用了两个不同的对象。FYI:这些只是“对象”,而不是“哈希”JavaScript按值传递引用,不通过引用传递——那完全是另外一回事。不管怎样,Dsh,tks,你的信息让我更清楚了。@cdhowie我这边的用词不正确。答案已更新。
o = { a : 20 }
obj = o;
obj.a = 10;
console.log(o.a);
function foo(a) {
a.bar = 2;
}
var b = { bar: 1 };
foo(b);
function foo(a) {
a = { bar: 2 };
}
var b = { bar: 1 };
foo(b);