0

我最近在 JS 中遇到了一个令人讨厌的问题。

假设我们将一个映射、一个对象数组传递给函数 f。

var o=[{a:0}];
function f(a){
    for(var i in a){
        if (a.hasOwnProperty(i)){
            a[i]=null;
        }
    }
    return a;
};
var outp=f(o);

alert(outp[0]+" === "+o[0]+" : "+(outp[0]===o[0]));

// here we expect loose equality, and equality in type, 
//furthermore it should identically equal as well, and we got right!

但是,我们不能将对象的全部责任作为参数传递给函数,就像在函数范式中一样o=(function(o){return o})(),因为没有引用对 o 的任何修改!

var o=[];
function ff(a){
    return (a=undefined);
};
var outp=ff(o);
alert(outp+" === "+o.constructor+" : "+(outp===o));
// here we expect true, but we got false!

为什么在第二个用例中上述参考丢失和可能不同的参考处理,尽管在这两种情况下,函数都将数组参数放在 0. 位置?

4

1 回答 1

1

Javascript 总是按值传递参数,所以这不起作用:

 function foo(x) {
    x = 100;
 }

 y = 5
 foo(y)
 y == 100 // nope

但是,这确实有效:

 function foo(x) {
    x.bar = 100;
 }

 y = {}
 foo(y)
 y.bar == 100 // yes

在第二个片段中,x 仍然是按值传递的,但是这个值是一个对象的引用(指针)。因此,可以在函数中取消引用它并访问对象“内部”的内容。

于 2013-04-08T14:33:39.670 回答