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?
3 respuestas
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));
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);
}
Puede encontrar el índice de NaN
usando firstIndex
. Intenta así.
var arr = [NaN];
let index = arr.findIndex(Number.isNaN)
console.log(index >= 0);
Preguntas relacionadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.