Number 对象

NaN 值的产生

  1. 将某些非数值强制转换为数值的时候,会得到 NaN

  2. 0 除以 0 会返回 NaN —— 但是其他数除以 0 则不会返回 NaN

Number(undefined)				// NaN
Number('undefined')				// NaN
Number('string')				// NaN
Number({})						// NaN
Number('10,3')					// NaN
Number('123ABC')				// NaN
Number(new Date().toString())	// NaN

类型转换

  1. 在非构造器上下文中,也就是没有 new 操作符时,Number 可以类型转换的函数使用;

  2. 接收一个参数,并将这个参数转换为数字,如果参数无法被转换为数字,则返回 NaN

Number('10')        // 10
Number('hello')     // NaN
Number('')          // 0
Number()            // 0
Number(undefined)   // NaN
Number(null)        // 0

移植全局方法

  1. ES5 中,如 parseFloat、parseInt 等都是全局方法,在 ES6 中把处理数值的一些方法都移植到了 Number 对象上了;

  2. 在后面的小节中会对 Number 上的方法和全局的方法进行对比,看它们有什么不同,ES6 又解决了什么问题;

parseInt('123');        // 123
Number.parseInt('123'); // 123

二进制和八进制表示法

  1. ES6 提供了二进制和八进制数值表示的新写法,分别用前缀 0b (或 0B0o (或 0O 表示;

    // es6 2进制 0B 开头
    console.log('B',0B111110111); 	// 503
    console.log('B',0b111110111); 	// 相同,0B 和 0b 都可以
    
    // es6 8进制 0o 开头
    console.log(0o767); 	// 503
    console.log(0O767); 	// 相同,0o 和 0O 都可以
    
  2. ES5 开始,在严格模式之中,八进制就不再允许使用前缀 0 表示,ES6 进一步明确,要使用前缀 0o 表示;

    // 非严格模式
    (function(){
      console.log(0o11 === 011);	// true
    })()
    
    // 严格模式
    (function(){
      'use strict';
      console.log(0o11 === 011);
    })()
    // Uncaught SyntaxError: Octal literals are not allowed in strict mode.
    
  3. 0b0o 前缀的字符串数值转为十进制,可以把 Number 对象直接作为方法使用

    Number('0b111')  // 7
    Number('0o10')   // 8
    

isFinite、Number.isFinite

  1. isFinite():在 ES5 中有全局的 isFinite() 函数用来判断被传入的参数值是否为一个有限的数值,如果参数是字符串,会首先转为一个数值,然后在进行验证;

    isFinite(Infinity);  // false
    isFinite(NaN);       // false
    isFinite(-Infinity); // false
    
    isFinite(0);         // true
    isFinite(2e64);      // true
    isFinite('2e64');    // true
    
    isFinite("0");       // true
    
  2. Number.isFinite():不会强制将一个非数值的参数转换成数值,这就意味着,只有数值类型的值,且是有穷的 (finite),才返回 true

    Number.isFinite(Infinity);  // false
    Number.isFinite(NaN);       // false
    Number.isFinite(-Infinity); // false
    
    Number.isFinite(0);         // true
    Number.isFinite(2e64);      // true
    Number.isFinite('2e64');	  // false
    
    Number.isFinite('0');       // false
    

isNaN、Number.isNaN

  1. isNaN 用了判断是否为 NaN 值,它接收的参数不是 Number 类型,isNaN 函数会先尝试将这个参数转换为数值,然后才会对转换后的结果是否是 NaN 进行判断;

    isNaN(NaN);       // true
    isNaN(undefined); // true
    isNaN('undefined')// true
    isNaN({});        // true
    
    isNaN(true);      // false
    isNaN(null);      // false
    isNaN(37);        // false
    
    // strings
    isNaN("37");      // false: 可以被转换成数值37
    isNaN("37.37");   // false: 可以被转换成数值37.37
    isNaN("37,5");    // true
    isNaN('123ABC');  // true:  parseInt("123ABC")的结果是 123, 但是Number("123ABC")结果是 NaN
    isNaN("");        // false: 空字符串被转换成0
    isNaN(" ");       // false: 包含空格的字符串被转换成0
    
    // dates
    isNaN(new Date());                // false
    isNaN(new Date().toString());     // true
    
    isNaN("hello")   // true: "hello"不能转换成数值
    
  2. Number.isNaN(x):检测变量 x 是否是一个 NaN,不会对所判断的值进行强制类型转换,是一种可靠的做法;

    Number.isNaN(NaN);        // true
    Number.isNaN(Number.NaN); // true
    Number.isNaN(0 / 0)       // true
    
    // 下面这几个如果使用全局的 isNaN() 时,会返回 true。
    Number.isNaN("NaN");      // false,字符串 "NaN" 不会被隐式转换成数字 NaN
    Number.isNaN(undefined);  // false
    Number.isNaN('undefined');// false
    Number.isNaN({});         // false
    Number.isNaN("blabla");   // false
    
    Number.isNaN(true);   	 // false
    Number.isNaN(null);   	 // false
    Number.isNaN(37);   	 // false
    Number.isNaN("37");   	 // false
    Number.isNaN("37.37");	 // false
    Number.isNaN("");   	 // false
    Number.isNaN(" ");   	 // false
    

Number 对象的方法

Number.parseInt、Number.parseFloat

  1. 为了保持方法上的统一,把全局下的 parseInt()parseFloat() 移植到 ES6Number 对象上;

  2. 将这两个全局方法移植到 Number 对象上,为了逐步减少全局性方法,使语言逐步模块化;

// 如何证明 Number 下的这两个方法只是移植全局的呢?可以利用 === 运算符来判断
Number.parseInt === parseInt;				// true
Number.parseFloat === parseFloat;		// true


// ES5的写法
parseInt('12.34') 						// 12
parseFloat('123.45#') 				// 123.45

// ES6的写法
Number.parseInt('12.34') 			// 12
Number.parseFloat('123.45#')  // 123.45

Number.isInteger

  1. Number.isInteger()ES6 新增的函数,用来判断给定的参数是否为整数;

  2. 其他方式:

    1. 任何整数都会被 1 整除,即余数是 0
    2. 使用 Math.round、Math.ceil、Math.floor 判断,因为整数取整后还是等于自己;
Number.isInteger(0);         // true
Number.isInteger(1);         // true
Number.isInteger(-100000);   // true

Number.isInteger(0.8);       // false
Number.isInteger(Math.PI);   // false

Number.isInteger(Infinity);  // false
Number.isInteger(-Infinity); // false
Number.isInteger("100");     // false
Number.isInteger(true);      // false
Number.isInteger(false);     // false
Number.isInteger([1]);       // false
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. Number 对象
    1. 1.1. NaN 值的产生
    2. 1.2. 类型转换
    3. 1.3. 移植全局方法
  2. 2. 二进制和八进制表示法
  3. 3. isFinite、Number.isFinite
  4. 4. isNaN、Number.isNaN
  5. 5. Number 对象的方法
    1. 5.1. Number.parseInt、Number.parseFloat
    2. 5.2. Number.isInteger