簡體   English   中英

為什么循環修改未在行中引用的其他變量(Javascript)?

[英]Why is for loop modifying an additional variable not referenced in the line (Javascript)?

我設置了兩個全局變量:

var topList = {
    a: {},
    b: {},
    c: {},
    d: {},
    e: {}
}

var compare = {
    a: {},
    b: {},
    c: {},
    d: {},
    e: {}
}

我有一個函數填充它們中的每一個,然后使用for循環來換出compare變量中的a對象。 然后它調用一個函數將新的comparetopList compare ,並返回兩者中較好的一個(因此將topList設置為兩者中較好的一個:

function optimize(data){

    var rawList = data.slice();

    var aList = $.grep(rawList, function(e) { return e.position == "A" });
    var bList = $.grep(rawList, function(e) { return e.position == "B" });
    var cList = $.grep(rawList, function(e) { return e.position == "C" });
    var dList = $.grep(rawList, function(e) { return e.position == "D" });
    var eList = $.grep(rawList, function(e) { return e.position == "E" });

    topList.a = aList[0];
    topList.b = bList[0];
    topList.c = cList[0];
    topList.d = dList[0];
    topList.e = eList[0];

    compare = topList;

    for (i = 0, len = aList.length; i < len; i++) {
        compare.a = aList[i];
        topList = best(topList, compare);
    }
}

出於某種原因,似乎當行compare.a = aList[i]; 被執行,它不僅換出a物體在compare變量,也是a在對象topList變量。 結果,我總是通過我的“最佳”功能發送兩個相同的列表,這使得它無用。

我是新手。 任何幫助將不勝感激!

為了簡單解釋,當你這樣做時:

var x = {};

您獲取一個空對象並將其分配給x

如果你這樣做:

var y = x;

您正在使用相同的對象並將其分配給y

從那以后,如果你這樣做......

y.foo = 'bar';

你會發現......

alert(x.foo); // bar (!)

這稱為by-reference賦值,它是帶有對象的JavaScript中發生的事情(注意,數組也是對象,使用預定義的方法)。

相反的是賦值by-value,其中值被復制到新變量。

因此,由於您具有此引用分配,因此您在一個位置進行的更改將影響另一個。 您將需要使用復制函數來獲取與第一個無關的新對象,並使用相同的值。

因為compare是對topList的引用。 你不需要放

compare =topList;

簡單來說,這可行:

compare .a = aList[0];
compare .b = bList[0];
compare .c = cList[0];
compare .d = dList[0];
compare .e = eList[0];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM