通过参数传递哈希

时间:2017-01-20 17:56:30

标签: javascript variables

我对将哈希作为参数传递给函数感到困惑。 我知道当变量通过参数传递给函数时,应用该值的副本。 但这对于哈希来说是无效的,至少并非总是如此。 例如:

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在这种情况下的工作原理吗?

3 个答案:

答案 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中不是这种情况。

如果(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。

总而言之,你必须意识到两件事:

  1. 变量永远不会包含对象,但它们可以包含对象的引用。两个持有对同一对象的引用的变量将反映对该对象所做的更改。

  2. 所有参数都是按值传递的,也就是说,被调用者无法直接访问传入的变量,而只能访问通过参数 - 可以是对象引用。操作该对象可能会导致传递引用,但请注意,传递给函数的变量仍然引用同一个对象,因此传递的变量不会以任何方式修改。

  3. 作为旁注,如果对象是可以直接存储在变量中的值,那么{} === {}将是真的,但它不是 - 因为引用被比较并找到不相等,因为这些引用指的是两个不同的对象。

答案 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