Javascript通过引用传递对象,然后更新
我一直在搜索,所以我知道有很多关于这个的话题,但我还没有找到一个回答我的问题 我看到一个关于从字符串中获取对象值的问题,如下所示:Javascript通过引用传递对象,然后更新,javascript,object,pass-by-reference,pass-by-value,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+
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;
}
x = {stateName:"California"};
这将更新x的值,而不是对象
我试过了
var x = getPropertyByString('myGlobalVar.someProp.stateName');
x.value = 'California';
那也没用
有人能用我的例子帮助我理解这一点吗
谢谢尝试以下方法
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;
}
你可以在这里看到它的作用
你的不起作用的原因是字符串在JavaScript中是不可变的。您正在使用值“California”重新分配变量x
,而不是将其指向的位置更新为“California”
如果你愿意的话
var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = 'California';
);当您操作由x
指向的对象时,而不是将x
重新指定为其他对象。以上是setPropertyByString()
方法在幕后所做的;它只是对你隐藏它。试试下面的方法
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;
}
你可以在这里看到它的作用
你的不起作用的原因是字符串在JavaScript中是不可变的。您正在使用值“California”重新分配变量x
,而不是将其指向的位置更新为“California”
如果你愿意的话
var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = 'California';
);当您操作由
x
指向的对象时,而不是将x
重新指定为其他对象。以上是setPropertyByString()
方法在幕后所做的;它只是对你隐藏了它。这就可以做到:
myGlobalVar.someProp.stateName=“加利福尼亚”
这也会:
myGlobalVar[“someProp”].stateName=“California”
或者这个:
myGlobalVar[“someProp”][“stateName”]=“California”
或者
var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = "California"
请注意,在我的上一个示例中,如果我执行以下操作:
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;
}
x = {stateName:"California"};
它不会更改myGlobalVar.someProp.stateName的值
使用
=
为LHS上的变量指定一个新值。这与为变量的引用对象指定一个新值不同。这样做可以:
myGlobalVar.someProp.stateName=“加利福尼亚”
这也会:
myGlobalVar[“someProp”].stateName=“California”
或者这个:
myGlobalVar[“someProp”][“stateName”]=“California”
或者
var x = getPropertyByString('myGlobalVar.someProp');
x.stateName = "California"
请注意,在我的上一个示例中,如果我执行以下操作:
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;
}
x = {stateName:"California"};
它不会更改myGlobalVar.someProp.stateName的值
使用=
为LHS上的变量指定一个新值。这与将新值分配给变量的引用对象不同