number
正数、负数、零、小数......
NaN:not a number
不是一个有效数字,但是属于 number 类型NaN
和NaN(本身)
不相等,和其它值也就不相等isNaN(value):
检测当前值是否不是是有效数字,不是有效数字返回true,是有效数字则返回falseObject.is(value1,value2):
判断两个值是否为同一个值,is方法内部做了特殊的处理
console.log(typeof NaN); // 'number'console.log(NaN === NaN); // falseconsole.log(isNaN(1)); // falseconsole.log(Object.is(NaN,NaN)) // true
+Infinity:无限大 -Infinity:无限小
1.isNaN 检测是否为有效数字
isNaN方法:
当我们使用 isNaN 检测基本类型值的时候,检测的值不是 number 类型的,浏览器会默认的把值先转换为 number 类型,然后再去检测
例如:isNaN('12') -> 使用 Number 方法转换为数字 -> 在进行检测console.log(isNaN('12')); // false
isNaN方法:当我们使用 isNaN 检测引用类型值的时候,会经过三个步骤
检测对象的
Symbol.toPrimitive
这个属性值,如果有则基于这个值进行运算,如果没有则进行2检测对象的
valueOf() 这个值「原始值:基本类型值」
,如果有则基于这个值进行判断,如果不是原始值则进行3获取对象的
toString()
把其变成字符串,再把字符串的值转换为 number 类型,然后再进行检测
例如1:let obj1 = {};console.log(isNaN(obj1)); // ture例如2:let obj2 = { [Symbol.toPrimitive]:function(lint){ return 10; }}console.log(isNaN(obj2)); // false例如3:let date = new Date();console.log(isNaN(date)); // 为什么是 false 呢?因为 new Date() 的原始值时数字例如4:let arr = [];arr[Symbol.toPrimitive]: function(lint){ return 10;}console.log(isNaN(arr)); // false 因为你给他添加了 Symbol.toPrimitive 属性函数,并且返回 10,所以判断时候走第一步啦
2.Number 转换为数字类型
Number方法(基本类型转换为数字):
转换的时候只要出现任何一个非有效数字字符
,最后结果都是NaN
console.log(Number('12')); //12console.log(Number('12px')); //NaN
除了几个特殊转换 console.log(Number(true)); //1console.log(Number(false));//0console.log(Number(null)); //0console.log(Number('')); //0console.log(Number(undefined)); //NaNconsole.log(Number(Infinity)); //Infinity
Number方法(引用类型转换为数字):
检测对象的
Symbol.toPrimitive
这个属性值,如果有则基于这个值进行运算,如果没有则进行2检测对象的
valueOf() 这个值「原始值:基本类型值」
,如果有则基于这个值进行判断,如果不是原始值则进行3获取对象的
toString()
把其变成字符串,再把字符串的值转换为 number 类型,然后再进行检测
console.log(Number(['12'])); // 12console.log(Number(['12','13'])); // NaNconsole.log(Number({a:1})); // NaN
3.parseInt 转换为整数
parseInt:
和 Number 方法在处理字符串的时候有所区别。提取规则:
从左到右依次查找有效数字字符,直到遇见非有效数字字符为止(不管后面是否还有,都不找了),把找到的转换为数字检测对象的
Symbol.toPrimitive
这个属性值,如果有则基于这个值进行运算,如果没有则进行2检测对象的
valueOf() 这个值「原始值:基本类型值」
,如果有则基于这个值进行判断,如果不是原始值则进行3获取对象的
toString()
把其变成字符串,再把字符串的值转换为 number 类型,然后再进行检测
console.log(parseInt("12px")); //12console.log(parseInt("12px13")); //12console.log(parseInt("px12")); //NaNconsole.log(parseInt("")); //NaNconsole.log(parseInt(true)); //NaN
3.parseFloat 转换为浮点数
在 parseFloat 的基础上可以识别小数点(只能识别一位)
检测对象的
Symbol.toPrimitive
这个属性值,如果有则基于这个值进行运算,如果没有则进行2检测对象的
valueOf() 这个值「原始值:基本类型值」
,如果有则基于这个值进行判断,如果不是原始值则进行3获取对象的
toString()
把其变成字符串,再把字符串的值转换为 number 类型,然后再进行检测
console.log(parseInt("12.2.2px")); //12.2console.log(parseInt("12px13")); //12console.log(parseInt("px12")); //NaNconsole.log(parseInt("")); //NaNconsole.log(parseInt(true)); //NaN
注意:把转换的值变成字符串再按上面规则查找