(旅行是最劳顿,最麻烦,叫人本相必现的时候。经过长期苦旅行而彼此不讨厌的人,才可以结交作朋友。——钱钟书)
为什么NaN在js值得一提
相信你在实际开发中,经常遇到一下场景
const pasNumber = parseInt(undefined);
console.log(pasNumber); // NaN
console.log(typeof pasNumber === 'number'); // true
console.log(Object.prototype.toString.call(pasNumber)); // '[object Number]'
console.log(NaN === NaN); // false
业务中不可避免的有些字段是空值,但经过转换后会变为NaN值,而在js中NaN的类型无论怎么判断都是数字,并且奇怪的是NaN并不等于NaN。
如何正确的对NaN做出判断
NaN的字面意思是Not-a-Number,其在计算机科学中属于计算中的缺失值。
NaN的由来说明
在js中可以是同isNaN方法来进行判断。
isNaN = function(value) {
var n = Number(value);//此处对参数进行强制类型转换
return n !== n;
};
console.log(isNaN(NaN)); // true
console.log(isNaN('123a')); // true
console.log(isNaN([1, 2, 3])); // true
console.log(isNaN({})); // true
但我们发现,因为每次都先将值进行数字强转,导致一些非NaN的值也被误判成了NaN。
所以在es5又给Number添加了isNaN方法,它的源码是这样的。
Number.isNaN = function(value) {
return value !== value;
};
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN('123a')); // false
console.log(Number.isNaN([1, 2, 3])); // false
console.log(Number.isNaN({})); // false
因为在js中,只有NaN是不等于自身的,所以Number.isNaN更为严谨。
所以,在后续的js编码中,对NaN的处理我们也可以尽量使用Number.isNaN了。