Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过参数传递散列_Javascript_Variables - Fatal编程技术网

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);