Javascript按引用传递对象然后更新

时间:2011-12-22 16:14:20

标签: javascript object pass-by-reference pass-by-value

我一直都在搜索,我知道有很多关于这方面的话题,但我没有找到一个回答我的问题。

我看到了一个关于从这样的字符串中获取对象值的问题:

function getPropertyByString(str) {
    var properties = str.split(".");
    var myTempObject = window[properties[0]];
    for (var i = 1, length = properties.length; i < length; i++) {
        myTempObject = myTempObject[properties[i]];
    }
    return myTempObject;
}

因此,如果有一个名为myGlobalVar的全局变量,你可以传递字符串'myGlobalVar.someProp.stateName',并且假设这一切都是有效的,你可以获得stateName的值,例如亚利桑那州。

我现在如何将该房产更新到加利福尼亚州?

如果我尝试

var x = getPropertyByString('myGlobalVar.someProp.stateName');
x = 'California';

将更新x的值,而不是对象。

我试过

var x = getPropertyByString('myGlobalVar.someProp.stateName');
x.value = 'California';

也不起作用。

有人可以通过我的例子帮助我理解这一点吗?

由于

2 个答案:

答案 0 :(得分:3)

尝试以下方法;

function setPropertyByString(path, value) {
    var steps = path.split("."),
        obj = window,
        i = 0,
        cur;

    for (; i < steps.length - 1; i++) {
        cur = obj[steps[i]];

        if (cur !== undefined) {
            obj = cur;
        } else {
            break;
        };
    };

    obj[steps[i]] = value;
}

它可以通过使用它来工作,如;

setPropertyByString('myGlobalVar.someProp.stateName', 'California');

你可以在这里看到它; http://jsfiddle.net/xCK8J/

你的原因不起作用是因为字符串在JavaScript中是不可变的。您正在使用值“加利福尼亚”重新分配变量x,而不是更新它指向“加利福尼亚”的位置。

如果你已经完成了;

var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = 'California';

You'd see it works;因为你正在操纵x指向的对象,而不是将x重新分配为其他东西。以上是setPropertyByString()方法在幕后的作用;它只是隐藏了你。

答案 1 :(得分:2)

这样可以解决问题:

myGlobalVar.someProp.stateName = "California"

那就是这样:

myGlobalVar["someProp"].stateName = "California"

或者这个:

myGlobalVar["someProp"]["stateName"] = "California"

或者,

var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = "California"

请注意,如果在我的上一个例子中,我做了类似的事情:

x = {stateName:"California"};

它不会更改myGlobalVar.someProp.stateName的值。

使用=为LHS上的变量分配一个新值。这与为变量的引用分配新值不同。