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上的变量指定一个新值。这与将新值分配给变量的引用对象不同