const _ = require('lodash');
console.log('NaN', _.isNaN(NaN), isNaN(NaN));
console.log('new Number(NaN)', _.isNaN(new Number(NaN)), isNaN(new Number(NaN)));
console.log('undefined', _.isNaN(undefined), isNaN(undefined));
console.log('null', _.isNaN(null), isNaN(null));
console.log('{}', _.isNaN({}), isNaN({}));
console.log('true', _.isNaN(true), isNaN(true));
console.log('37', _.isNaN(37), isNaN(37));
// strings
console.log('37.37', _.isNaN('37.37'), isNaN('37.37')); // "37.37" is converted to the number 37.37 which is not NaN
console.log("37,5", _.isNaN("37,5"), isNaN("37,5"));
console.log('123ABC', _.isNaN('123ABC'), isNaN('123ABC')); // parseInt("123ABC") is 123 but Number("123ABC") is NaN
console.log('', _.isNaN(''), isNaN('')); // the empty string is converted to 0 which is not NaN
console.log(' ', _.isNaN(' '), isNaN(' ')); // a string with spaces is converted to 0 which is not NaN
// dates
console.log('new Date()', _.isNaN(new Date()), isNaN(new Date()));
console.log('new Date().toString()', _.isNaN(new Date().toString()), isNaN(new Date().toString()));
// This is a false positive and the reason why native isNaN is not entirely reliable
console.log('blabla', _.isNaN('blabla'), isNaN('blabla'));