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通过引用传递对象然后更新的主要内容,如果未能解决你的问题,请参考以下文章