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); // 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 类型,然后再进行检测

    例如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')); //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
    

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