[英]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
對象。 然后它調用一個函數將新的compare
與topList
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.