1.JS中数据类型(number,细节)
number
-
正数、负数、零、小数...... -
NaN:not a number不是一个有效数字,但是属于 number 类型-
NaN和NaN(本身)不相等,和其它值也就不相等 -
isNaN(value):检测当前值是否不是是有效数字,不是有效数字返回true,是有效数字则返回false -
Object.is(value1,value2):判断两个值是否为同一个值,is方法内部做了特殊的处理
console.log(typeof NaN); // 'number' console.log(NaN === NaN); // false console.log(isNaN(1)); // false console.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方法(基本类型转换为数字):转换的时候只要出现任何一个非有效数字字符,最后结果都是NaNconsole.log(Number('12')); //12 console.log(Number('12px')); //NaN除了几个特殊转换 console.log(Number(true)); //1 console.log(Number(false));//0 console.log(Number(null)); //0 console.log(Number('')); //0 console.log(Number(undefined)); //NaN console.log(Number(Infinity)); //Infinity -
Number方法(引用类型转换为数字):-
检测对象的
Symbol.toPrimitive这个属性值,如果有则基于这个值进行运算,如果没有则进行2 -
检测对象的
valueOf() 这个值「原始值:基本类型值」,如果有则基于这个值进行判断,如果不是原始值则进行3 -
获取对象的
toString()把其变成字符串,再把字符串的值转换为 number 类型,然后再进行检测
console.log(Number(['12'])); // 12 console.log(Number(['12','13'])); // NaN console.log(Number({a:1})); // NaN
-
3.parseInt 转换为整数
-
parseInt:和 Number 方法在处理字符串的时候有所区别。提取规则:从左到右依次查找有效数字字符,直到遇见非有效数字字符为止(不管后面是否还有,都不找了),把找到的转换为数字-
检测对象的
Symbol.toPrimitive这个属性值,如果有则基于这个值进行运算,如果没有则进行2 -
检测对象的
valueOf() 这个值「原始值:基本类型值」,如果有则基于这个值进行判断,如果不是原始值则进行3 -
获取对象的
toString()把其变成字符串,再把字符串的值转换为 number 类型,然后再进行检测
console.log(parseInt("12px")); //12 console.log(parseInt("12px13")); //12 console.log(parseInt("px12")); //NaN console.log(parseInt("")); //NaN console.log(parseInt(true)); //NaN
-
3.parseFloat 转换为浮点数
-
在 parseFloat 的基础上可以识别小数点(只能识别一位)-
检测对象的
Symbol.toPrimitive这个属性值,如果有则基于这个值进行运算,如果没有则进行2 -
检测对象的
valueOf() 这个值「原始值:基本类型值」,如果有则基于这个值进行判断,如果不是原始值则进行3 -
获取对象的
toString()把其变成字符串,再把字符串的值转换为 number 类型,然后再进行检测
console.log(parseInt("12.2.2px")); //12.2 console.log(parseInt("12px13")); //12 console.log(parseInt("px12")); //NaN console.log(parseInt("")); //NaN console.log(parseInt(true)); //NaN -
注意:把转换的值变成字符串再按上面规则查找