¿Por qué Javascript es igual a 5== 8 como verdadero?




html checkbox (2)

Parece que el bucle estaba causando tu problema.

  1. Estabas comprobando la existencia de x , que en el primer bucle era falso
  2. Lo empujaste a la matriz
  3. Segundo bucle, existió y fue reemplazado por 123.

Puede simplificar drásticamente su código eliminando uno de los controles if, y utilizando array.prototype.includes lugar de realizar un bucle y verificar la igualdad.

Edición: Se agregó una tercera entrada para demostrar que se agregó 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>

Así que tengo 2 casillas de verificación:

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>

Cuando hago clic en una casilla de verificación, la agrega a una lista de JavaScript, si ya está en la lista, quiero sobrescribirla con otro valor (123 en este ejemplo).

Pero cuando hago clic en el segundo (no importa el orden, el segundo elemento siempre es 123 por alguna razón).

Donde, como lo esperaría, si hago clic en la casilla de verificación superior sería una lista que contiene '5', luego, al hacer clic en la segunda casilla de verificación, esperaría 5,8 pero se alerta como 5,123 , no veo realmente por qué está funcionando esto como 5==8 es falso ... ¿alguna idea?

Algoritmo actualizado para solucionar el problema subyacente:

En caso de que alguien alguna vez lo encuentre útil, cambié el algoritmo a una mejor alternativa:

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);
}

Porque estás iterando sobre la lista de statusList . En la primera iteración, verifica si 5 == 8, luego se mueve a la parte else e inserta 8 en statusList . Su statusList es = [5, 8]. Para la siguiente iteración, esto se convierte en verdadero. statuslist[i] será 8 y 8 === 8 y su declaración - statusList[i] = 123; Reemplazará los últimos 8 valores insertados con 123 . Por lo tanto, la matriz statusList tendrá ["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>







equality