En primer lugar, este no es un problema al que me enfrento. Estaba revisando algunos blogs de Javascript cuando encontré los métodos prototipo de matriz de .indexOf and .includes. Entonces, si una matriz tiene NaN como valor, entonces probablemente indexOf no pueda resolverlo y me queda usar .includes. Pero mi pregunta aquí es, dado que la compatibilidad del navegador de includes en realidad excluye IE, ¿cuál debería ser la alternativa para detectar la verificación de NaN? Pensé en construir un polyfill refiriéndome a esto

if (Array.prototype.includes) {
  Object.defineProperty(Array.prototype, "includes", {
    enumerable: false,
    value: function(obj) {
        var newArr = this.filter(function(el) {
          return el == obj;
        });
        return newArr.length > 0;
      }
  });
}

var arr = [NaN];
console.log(arr.includes(NaN));

Pero desafortunadamente, también está volviendo falso. Entonces, ¿qué otras opciones tengo? ¿O me estoy perdiendo algo?

1
Krishna Prashatt 10 may. 2019 a las 13:21

3 respuestas

La mejor respuesta

También puede incluir un polyfill para Number.isNaN, y luego usarlo en su prueba filter - si tanto obj como el pasan Number.isNaN, luego regrese cierto:

Number.isNaN = Number.isNaN || function(value) {     
    return value !== value;
}

// if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, "includes", {
    enumerable: false,
    value: function(obj) {
        var newArr = this.filter(function(el) {
          return el == obj || Number.isNaN(el) && Number.isNaN(obj);
        });
        return newArr.length > 0;
      }
  });
// }

var arr = [NaN];
console.log(arr.includes(NaN));
1
CertainPerformance 10 may. 2019 a las 10:27

Array#includes usa el algoritmo del mismo valor cero, que no es el mismo que ==.

El mismo valor es proporcionado por {{X0} }, y puede verificar manualmente -0 y +0 para obtener la parte "-Cero" de la verificación.

La página vinculada incluye un polyfill, aunque dado que el polyfill incluye un paso para hacer que -0 y +0 sean diferentes, lo que no desea en un algoritmo del mismo valor cero, puede dejarlo fuera y simplificar en consecuencia:

function SameValueZero(x, y) {
    return x === y || (x !== x && y !== y);
}
1
Niet the Dark Absol 10 may. 2019 a las 10:27

Puede encontrar el índice de NaN usando firstIndex. Intenta así.

var arr = [NaN];
let index = arr.findIndex(Number.isNaN)
console.log(index >= 0);
0
Syed mohamed aladeen 10 may. 2019 a las 10:34