Javascript通过引用传递对象然后更新

Posted

技术标签:

【中文标题】Javascript通过引用传递对象然后更新【英文标题】:Javascript pass by object by reference then update 【发布时间】: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';

那也没用。

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

谢谢

【问题讨论】:

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

【讨论】:

以上是关于Javascript通过引用传递对象然后更新的主要内容,如果未能解决你的问题,请参考以下文章

对象作为参数传递给另一个类,通过值还是引用?

Javascript 是不是通过引用或值将数组传递给函数?

python中函数参数的引用方式

Javascript:通过引用传递对象

Javascript 之《函数传参到底是值传递还是引用传递》

JavaScript - 通过引用传递时清空数组/对象问题