Estoy ejecutando el código a continuación, verificando si la cadena es una fecha. Uno de mis valores de entrada es 'text' que devuelve el valor NaN pero mi cláusula if no funciona como se esperaba.
function isDate(myDate) { console.log('myDate = ' + myDate); return Date.parse(new Date(myDate)); } // var date1 = '1/5/22'; // good date var date1 = 'test'; // bad date var whatDate = isDate(date1); console.log('date = ' + whatDate); if (whatDate == 'NaN') { console.log('bad date'); } else { console.log('good date'); }en su declaración if está comprobando si whatDate es igual a la cadena "NaN". lo que desea verificar si whatDate es un número o no.
puedes probar
if (isNaN(whatDate))Ya casi estás ahí:
if(whatDate == 'NaN'){ log.debug('bad date'); }else{ log.debug('good date'); } En lugar de comparar whatDate con 'NaN' use la función isNaN() :
if(isNaN(whatDate)){ log.debug('bad date'); }else{ log.debug('good date'); } Alternativamente, si realmente desea comparar con 'NaN' , primero debe convertir whatDate en una cadena:
if((whatDate + "") == 'NaN'){ log.debug('bad date'); }else{ log.debug('good date'); }Es una posibilidad. Otra forma sería
if(whatDate.toString() == 'NaN'){ log.debug('bad date'); }else{ log.debug('good date'); }La siguiente respuesta, además de lo ya explicado sobre cómo detectar un valor NaN , quiere llegar más lejos.
Una función de verificación o prueba, especialmente si también lleva el prefijo is en su nombre , siempre debe devolver exclusivamente un valor booleano .
NaN exactamente una vez dentro de la implementación de la función de prueba.Editar de acuerdo y gracias a la aclaración de RobG.
... y ... de acuerdo con la especificación de ECMAScript con la creación de instancias de un objeto Date , el argumento pasado a la función constructora se analizará y asignará a la ranura interna thisTimeValue . El tipo de número de este último es el valor NaN para un argumento no analizable (no válido).
Cualquier operación relacionada con valueOf devuelve el valor de la ranura interna thisTimeValue .
Cualquier operación relacionada con toString calculará un formato de cadena de fecha a partir del último valor. Para thisTimeValue de NaN , el valor de cadena devuelto debe ser 'Invalid Date' .
Por lo tanto, una implementación de validación/prueba podría haber sido algo así como...
function isParsableDateRepresentative(...args) { return String(new Date(...args)) !== 'Invalid Date'; }... pero preferiblemente debería estar más cerca del próximo provisto ...
function isParsableDateRepresentative(...args) { return !Number.isNaN(new Date(...args).valueOf()); }Pruebas:
function isParsableDateRepresentative(...args) { return !Number.isNaN(new Date(...args).valueOf()); } console.log('new Date("1/5/22") ...', new Date("1/5/22")); console.log( 'isParsableDateRepresentative("1/5/22") ...', isParsableDateRepresentative("1/5/22") ); console.log('\nnew Date("test") ...', new Date("test")); console.log( 'isParsableDateRepresentative("test") ...', isParsableDateRepresentative("test") ); console.log('\nnew Date(new Date("test")) ...', new Date(new Date("test"))); console.log( 'isParsableDateRepresentative(new Date("test")) ...', isParsableDateRepresentative(new Date("test")) ); console.log('\nnew Date() ...', new Date()); console.log( 'isParsableDateRepresentative() ...', isParsableDateRepresentative() ); console.log('\nnew Date(null) ...', new Date(null)); console.log( 'isParsableDateRepresentative(null) ...', isParsableDateRepresentative(null) ); console.log('\nnew Date(undefined) ...', new Date(undefined)); console.log( 'isParsableDateRepresentative(undefined) ...', isParsableDateRepresentative(undefined) ); console.log('\nnew Date("") ...', new Date("")); console.log( 'isParsableDateRepresentative("") ...', isParsableDateRepresentative("") ); .as-console-wrapper { min-height: 100%!important; top: 0; }