Es posible que uses con frecuencia una librería de utilidades de Javascript para tu aplicación. Ya sea para acelerar tu proceso de desarrollo o simplemente quieres alguna función de utilidad que esté probada y que haya sido probada. Algunas librerías de utilidades populares que conocemos son lodash y underscore.

¿Has utilizado alguna vez la librería de utilidades para validar si una variable es un número válido? Válido significa que el valor no causará un error o no devolverá un resultado inesperado, como NaN. Si tienes una dependencia de lodash o underscore, podrías estar tentado a usar esa función isNumber. Parece que hace precisamente eso, ¿no?

Veamos la implementación de lodash y underscore para la función isNumber.

https://github.com/jashkenas/underscore/blob/e51aa7251f3e010fe003fbb9d969a74b9dcda103/underscore.js#L1325-L1330
https://github.com/lodash/lodash/blob/04ebca6c86deba0ff733847f6c11fd5265e1ce03/isNumber.js#L29-L32

Ambas bibliotecas populares tienen una implementación similar. Compararán el tipo de nombre de clase Javascript variable con la cadena . Eso se aplica no sólo al tipo Number sino también a otros tipos como Date, function, etc.

Podrías pensar que está bien, pero ¿eres consciente de que NaN también es un Number en Javascript? NaN en javascript es un Número que representa el valor: Not-A-Number. Un poco confuso ¿verdad? Puedes comprobarlo tú mismo en la consola de javascript.

toString.call(NaN)
// ->

Así que usar el método isNumber no es realmente la forma correcta para el caso de uso anterior. Necesitamos otra validación, que es comprobar si el número no es NaN . Terminaremos con algo como esto.

const isValidNumber = _.isNumber(obj) && !isNaN(obj)

¿Qué tal la función isDate? ¿Qué puede causar potencialmente un problema?

Intenta inicializar un objeto Date no válido, como new Date("31/1/2019") o new Date("test123") . El valor resultante seguirá siendo un objeto Date pero será un objeto Date no válido. Eso probablemente hará que su lógica relacionada con la Fecha sea defectuosa. Por lo tanto, deberíamos añadir otro paso para validar el objeto Date, quizás esto sea suficiente:

const isValidDate = _.isDate(obj) && !isNaN(obj.getTime()) 

Recapitulación:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *