¿Hay alguna forma de detectar, o protegerse de manera segura, los valores de NaN durante el tiempo de ejecución, en cualquier parte de la aplicación donde puedan aparecer?
NaN que pueden ocurrir en ciertas construcciones? Pseudocódigo de un escenario donde la prueba de NaN puede ser difícil:
function undetectedNaN (): AssumeStrictDataTypes { // 1. Some algorithm ... // 2. NaN appears undetected ... // 3. Some algorithm ... // 4. Return: Broken but seeming legit value and data type } (Suponga que está en una base de código de aplicación más grande, donde agregar controles para isNaN() y validar valores individuales no es una opción: podría ser demasiado costoso, no es un requisito, no es posible realizar pruebas automatizadas, etc.)
ACTUALIZACIÓN 2021/12: Para complementar mi pregunta bastante abstracta: en un caso de uso más práctico, los valores de API no existían en una estructura de matriz. La mayoría de las ocurrencias de NaN podrían resolverse mediante una mejor verificación de valor/tipo.
function example (a, b) { return a[0] + b[0] } // undefined + undefined = NaN const result = example([], []); console.log(result); Algunas otras posibilidades de que ocurra NaN :
const testArray = []; const testObject = {}; testArray[0] + testArray[0] // NaN testObject.X + testObject.X // NaN undefined + undefined // NaN NaN + NaN // NaN Otros lugares donde NaN puede ser más difícil de rastrear: por ejemplo, si aparece durante el tiempo de ejecución, en algún lugar, a veces, y no es un valor de retorno comprobable.
// Bitwise operators ~(NaN) // -1 // Conditionals if (NaN > 1) {} // false // Typecasting !!NaN // falseNo hay una forma sencilla de lograr esto.
No hay una manera fácil de detectar esto estáticamente (para un linter). NaN puede ser el resultado de operaciones simples como la multiplicación y la división, por lo que podría ocurrir en cualquier lugar.
Por supuesto, sería técnicamente posible detectar expresiones que siempre evalúen a NaN , como si tuviera que escribir 0/0 . Pero esto probablemente no es lo que estás buscando.
Que yo sepa, no existe un marco que pueda detectar que NaN ocurre en algún lugar en tiempo de ejecución. Creo que para lograr esto de la manera que desea, necesitaría soporte para ello a nivel de motor JS.
Podría inventar soluciones pirateadas como crear funciones para operaciones aritméticas como multiply o envolver números en objetos que anulen la función valueOf() . Pero ninguno de ellos funcionará en todos los casos y hacen que su código sea mucho menos agradable.
Al final, NaN es un número perfectamente válido. Lo detectaría como detectaría cualquier otro valor. Por ejemplo, si su algoritmo no puede manejar números negativos, tampoco puede modificar el lenguaje para que le indique cuándo tiene números negativos. En su lugar, tendría que diseñar su código de tal manera que no se produzcan valores negativos o escribir muchas comprobaciones/afirmaciones.