我对将哈希作为参数传递给函数感到困惑。 我知道当变量通过参数传递给函数时,应用该值的副本。 但这对于哈希来说是无效的,至少并非总是如此。 例如:
var a = {b: 'hello world'};
var change = function(h){
h = true;
};
var change_v2 = function(h){
h.b = 'another hello';
};
console.log(a); // will print the original hash
change(a);
console.log(a); // naturally, will print the original hash
change_v2(a);
console.log(a); // this print b == 'another hello'
那么,为什么有时候对哈希使用引用呢? 有人可以解释javascript在这种情况下的工作原理吗?
答案 0 :(得分:2)
您的问题的简单答案是被复制 - a
不包含任何对象(您称之为哈希)但实际上包含引用对象和此引用已复制到参数local。
请阅读以下内容,详细了解为何会出现这种情况,按值传递与传递参考。
在JavaScript中,变量不包含对象,它们包含对象的引用。这是一个重要的区别。
所有参数都是JavaScript中的pass-by-value。存储在变量中的对象引用按值传递。
这两种行为结合起来导致您所看到的特定行为。让我们列出一些每个传递行为的例子来证明JavaScript按值传递参数。
function foo(a) {
a.bar = 2;
}
var b = { bar: 1 };
foo(b);
如果按值传递对象, b.bar
仍为1,但在JavaScript中不是这种情况。
b.bar
为2。
因此,在这种情况下,“按值传递引用”和“按引用传递参数”在行为上没有区别。现在让我们介绍一下 不同的情况。
function foo(a) {
a = { bar: 2 };
}
var b = { bar: 1 };
foo(b);
如果对象按值传递,则 b.bar
将为1,这不会发生。
b.bar
也将为1, 会发生什么。
b.bar
将为2。
总而言之,你必须意识到两件事:
变量永远不会包含对象,但它们可以包含对象的引用。两个持有对同一对象的引用的变量将反映对该对象所做的更改。
所有参数都是按值传递的,也就是说,被调用者无法直接访问传入的变量,而只能访问值通过参数 - 可以是对象引用。操作该对象可能会导致传递引用,但请注意,传递给函数的变量仍然引用同一个对象,因此传递的变量不会以任何方式修改。
作为旁注,如果对象是可以直接存储在变量中的值,那么{} === {}
将是真的,但它不是 - 因为引用被比较并找到不相等,因为这些引用指的是两个不同的对象。
答案 1 :(得分:0)
Javascript是传递引用。总是。分配更改名称以引用某个值。
所以,
function foo(h)
{ h = "bar"; }
名称h
是函数的参数。该分配仅影响名称h
,该名称仅存在于函数调用的范围中。
相反,语句h.b = "bar";
未分配给名称h
。它分配给名称b
引用的对象中的字段h
。
答案 2 :(得分:-1)
这是因为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);
你会看到同样的效果。
详细解释here