[英]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.