Javascript:在数组中设置一个值会将所有其他值设置为该值

Javascript: Setting one value in an array sets all others to that value

本文关键字:设置 其他 一个 数组 Javascript      更新时间:2023-09-26

当我尝试用javascript在数组中设置值时,所有其他"相邻"值也会发生变化。

var screenData = [];
function init() {
    var properties = { "property": "value" }
    for( i = 0; i < 35; i++ ) {
        var row = [];
        for( j = 0; j < 19; j++ ) {
            row.push(properties);
        }
        screenData.push(row);
    }
}
init();
screenData[0][0].property = "othervalue";
alert(screenData[0][1].property);

警报将返回othervalue,尽管它应该是value:(

是我刚刚监督了什么,还是这是一个bug?

如有任何帮助,我们将不胜感激:3

这是因为您引用了同一个对象(properties),因此每次修改property时,它都会到处更新。

function init() {
    for( i = 0; i < 35; i++ ) {
        var row = [];
        for( j = 0; j < 19; j++ ) {
            row.push({ property: 'value' });
        }
        screenData.push(row);
    }
}

这是因为在每次迭代中都要推送相同的对象,所以应该克隆该对象,然后push克隆的对象。当前,数组的所有元素都指向同一个对象。

这不是一个bug。您正在将属性对象的引用推送到数组中。这意味着您的数组包含对同一对象的多个引用。可以通过重置for循环中的属性变量来解决此问题。

function init() {
   for( i = 0; i < 35; i++ ) {
        var row = [];
        for( j = 0; j < 19; j++ ) {
            var properties = { "property": "value" }
            row.push(properties);
        }
        screenData.push(row);
    }
}

我认为,相反,这是:

for( j = 0; j < 19; j++ ) {
        row.push(properties);
    }
screenData.push(row);

可能是:

for( j = 0; j < 19; j++ ) {
        row.push(_clone(properties));
    }
screenData.push(row);

其中_.clone(object)是Underscore库函数:Underscore_clone引用

请注意,正如您在这里所读到的,嵌套对象(在这种情况下不是,因为这是字符串)被引用而不是复制。