繁体   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