为什么Javascript将5== 8等同为真?




html checkbox (2)

因为您正在迭代 statusList 。 在第一次迭代时,检查是否5 == 8,然后移动到else部分并在 statusList 插入 8 。 你的statusList是= [5,8]。 对于下一次迭代,这变为真正的 statuslist[i] 将是8和8 === 8和你的语句 - statusList[i] = 123; 将用 123 替换最后插入的 8 值。 因此,您的statusList数组将具有 ["5", 123]

var statusList = [];

function updateStatusString(x) {
  const input = parseInt(x);
  if (statusList != null) {
    if (statusList.includes(input)) {
      const idx = statusList.indexOf(input);
      statusList[idx] = 123;
    } else {
      statusList.push(input);
    }
    alert(statusList);
  }
}
<label>&nbsp;<input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")>&nbsp;"Active"</label>

<label>&nbsp;<input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")>&nbsp;"Active"</label>

所以我有2个复选框:

var statusList = [];
function updateStatusString(x) {
    if (statusList != null) {
        if (statusList.length > 0) {
            for (var i = 0; i < statusList.length; i++) {
                if (parseInt(statusList[i]) == parseInt(x)) {
                    statusList[i] = 123;
                } else {
                    statusList.push(x);
                }
            }
        } else {
            statusList.push(x);
        }
    }
    alert(statusList);
}
<label>&nbsp;<input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")>&nbsp;"Active"</label>
<label>&nbsp;<input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")>&nbsp;"Active"</label>

当我单击一个复选框时,它会将其添加到JavaScript列表中,如果它已经在列表中,我想用另一个值覆盖它(本例中为123)。

但是当我点击第二个(与顺序无关,第二个元素由于某种原因总是123。

如果我单击顶部的复选框,它会是一个包含'5'的列表,然后单击第二个复选框,我预计会有5,8,但它会警告为 5,123 ,不知道为什么会这样做这 5==8 是假的......任何想法?

更新算法以解决潜在问题:

如果有人发现这个有用,我将算法改为更好的选择:

var statusList = [];
function updateStatusString(x) {
    if (statusList.length > 0) {
        if (statusList.includes(x)) {
            var idx = statusList.indexOf(x);
            if (idx != -1) {
                statusList.splice(idx, 1);
            }
        }
        else {
            statusList.push(x);
        }
    } else {
        statusList.push(x);
    }
    alert(statusList);
}

看起来循环导致了您的问题。

  1. 你正在检查 x 的存在,它在第一个循环上是假的
  2. 你把它推到了阵列
  3. 第二个循环,它存在并被123替换

您可以通过删除其中一个if检查,并使用 array.prototype.includes 而不是循环和检查相等来大大简化代码。

编辑: 添加第三个输入以演示添加 123

var statusList = [];
function updateStatusString(x) {
    if (statusList != null) {
      if (statusList.includes(x)) {
          statusList[statusList.indexOf(x)] = 123;
      } else {
          statusList.push(x);
      }
    }
    
    alert(statusList);
}
<label>&nbsp;<input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")>&nbsp;"Active"</label>
<label>&nbsp;<input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")>&nbsp;"Active"</label>
<label>&nbsp;<input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("5")>&nbsp;"Active"</label>





equality