1.JS中数据类型(number,细节)

1.JS中数据类型(number,细节)

number

  • 正数、负数、零、小数......

  • NaN:not a number 不是一个有效数字,但是属于 number 类型

    • NaNNaN(本身)不相等,和其它值也就不相等

    • isNaN(value): 检测当前值是否不是是有效数字,不是有效数字返回true,是有效数字则返回false

    • Object.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 类型,然后再进行检测

    例如1let obj1 = {};console.log(isNaN(obj1)); // ture例如2let obj2 = {  [Symbol.toPrimitive]:function(lint){    return 10;  }}console.log(isNaN(obj2)); // false例如3let date = new Date();console.log(isNaN(date)); // 为什么是 false 呢?因为 new Date() 的原始值时数字例如4let 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

注意:把转换的值变成字符串再按上面规则查找

推荐阅读