【问题标题】:Why is for loop modifying an additional variable not referenced in the line (Javascript)?为什么 for 循环修改行中未引用的附加变量(Javascript)?
【发布时间】:2015-12-25 17:08:42
【问题描述】:

我设置了两个全局变量:

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

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

我有一个函数填充它们中的每一个,然后使用 for 循环换出 compare 变量中的 a 对象。然后它调用一个函数将新的comparetopList 进行比较,并返回两者中较好的一个(因此将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]; 行时,不仅换出了compare 变量中的a 对象,还换出了topList 变量中的a 对象。结果,我总是通过我的“最佳”功能发送两个相同的列表,这使它毫无用处。

我是新手。任何帮助将不胜感激!

【问题讨论】:

  • $.grep 在做什么?
  • compare 是对topList 的引用吗?例如当您在开发者控制台中运行 compare === topList 时,它的计算结果是 true 吗?
  • 如果这是 jQuery 请标记为这样。
  • @NinaScholz 我正在使用 $.grep 过滤数组。 api.jquery.com/jquery.grep

标签: javascript for-loop


【解决方案1】:

试图简单地解释一下,当你这样做时:

var x = {};

您取一个空对象并将其分配给x

如果你这样做:

var y = x;

您正在获取相同的对象并将其分配给y

从那时起,如果你这样做......

y.foo = 'bar';

你会发现...

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

这称为按引用赋值,这就是在 JavaScript 中使用对象时发生的事情(请注意,数组也是对象,具有预定义的方法)。

相反的是按值赋值,将值复制到新变量中。

因此,由于您有此按引用分配,因此您在一个地方所做的更改会影响另一个地方。您将需要使用复制函数来获取与第一个对象无关的具有相同值的新对象。

【讨论】:

    【解决方案2】:

    因为 compare 是对 topList 的引用。 你不需要放

    compare =topList;
    

    很简单,这样就可以了:

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

    【讨论】:

      猜你喜欢
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多