【问题标题】:Javascript pass by object by reference then updateJavascript通过引用传递对象然后更新
【发布时间】:2012-01-26 06:13:04
【问题描述】:

我一直在搜索 SO,我知道有很多关于此的主题,但我还没有找到一个回答我的问题的主题。

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

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 的值,例如 Arizona。

我现在如何将该属性更新到加利福尼亚?

如果我尝试

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

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

我试过了

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

那也没用。

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    试试下面的;

    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 中是不可变的。您正在使用值“California”重新分配变量 x,而不是将其指向的位置更新为“California”。

    如果你已经完成了;

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

    You'd see it works;当您操作x 指向的对象时,而不是将x 重新分配为其他对象。以上就是setPropertyByString()方法在幕后所做的;它只是对你隐藏它。

    【讨论】:

      【解决方案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 上的变量分配一个新值。这与将新值分配给变量的所指对象不同。

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 2015-09-19
        • 1970-01-01
        • 2013-10-12
        • 2015-06-18
        • 1970-01-01
        • 2017-09-11
        • 2019-06-05
        相关资源
        最近更新 更多