zoukankan      html  css  js  c++  java
  • [JavaScript语法学习]全面介绍Number

    JavaScript中的Number对象是经过封装的能够让你处理数字值的对象,Number对象是由Number()构造器创建的

    语法

    new Number(value);

    属性

    Number.EPSILON  两个可表示数之间的最小间隔( 2.220446049250313e-16 )
    Number.MAX_SAFE_INTEGER 最大的安全整数(253-1 = 9007199254740991)
    Number.MAX_VALUE 能表示的最大正数  ( 1.7976931348623157e+308 )
    Number.MIN_SAFE_INTEGER 最小的安全整数( -253+1 = -9007199254740991)
    Number.MIN_VALUE 能表示的最小正数 ( 5e-324 )
    Number.NaN  
    Number.NEGATIVE_INFINITY 特殊的负无穷大值,在溢出时返回该值 ( -Infinity )
    Number.POSITIVE_INFINITY 特殊的正无穷大值,在溢出时返回该值 (  Infinity )
    Number.prototype  

    方法

    Number.isNaN(value)  (ES6新增)

    用来检测传入的值是否为NaN,返回布尔值.

    因为NaN==NaN  NaN===NaN都会返回false, 所以不能使用相等运算符来判断某个值是否为NaN

    只有在value为真正的数字类型且值为NaN时才会返回true

    //返回true

    Number.isNaN(NaN)

    Number.isNaN(Number.NaN)

    Number.isNaN(0/0)

    //返回false

    Number.isNaN(45)

    Number.isNaN("45")

    Number.isNaN("")

    Number.isNaN(null)

    Number.isNaN(true)

    Polyfill

    Number.isNaN = Number.isNaN || function(value){

              return typeof value === "number" && isNaN(value);

            }

    Number.isFinite(value) (ES6新增)

    用来检测传入的值是否为一个有穷数( finite number),返回布尔值

    只有数值类型的值为有穷数时才会返回true

    //返回false

    Number.isFinite(Infinity)

    Number.isFinite(-Infinity)

    Number.isFinite(NaN)

    Number.isFinite("45")

    //返回true

    Number.isFinite(2e52)

    Polyfill

    Number.isFinite = Number.isFinite ||  function(value){

                return typeof value === "number" && isFinite(value);

              }

    总结:

    与传统的isFinite()和isNaN()方法的区别在于,传统方法会先调用Number()方法将非数值转换为数值,再进行判断。

    而Number.isFinite()和Number.isNaN()方法只对数值才有效,所以传入参数如果是非数值则直接返回false

    任何与NaN有关的运算结果都是NaN

    NaN与任何值都不相等,即使是NaN自身比较也不相等 

    Number.isInteger(value)  (ES6新增)

    用来判断给定的参数是否为整数,返回布尔值。NaN和正负Infinity都不是整数。

    //返回true

    Number.isInteger(0)

    Number.isInteger(-1)

    //返回false

    Number.isInteger(0.1)

    Number.isInteger(Math.PI)

    Number.isInteger("0")

    Number.isInteger(false)

    Number.isInteger([1])

    Number.isInteger(Infinity)

    Polyfill

    Number.isInteger = Number.isInteger || function(){

                 return typeof value === "number" && isFinite(value) && Math.floor(value) === value;

              }

    Number.isSafeInteger()

    用来判断某个值是否落在安全整数范围内

    大坑:

    这个方法只会验证运算结果(也就是传入的参数)是否落在安全整数范围内。但是有时候我们需要判断参与运算的每个值是否落在安全范围内。

    Number.isSafeInteger(9007199254740993 - 992);
    // 这个方法返回的结果是true
    // 但是这个运算结果不准确,因为第一个数值已经超出了安全整数范围
    // 超出安全整数范围的值是等于最大安全整数的
    
    function trusty(left, right, result){
        if(Number.isSafeInteger(left) && Number.isSafeInteger(right) && Number.isSafeInteger(result)){
        return result;
    }
        throw new RangeError("operation cannot be trusted!");
    }

    Number.ParseFloat()  (ES6新增)

    parseFloat(string)全局函数:将参数中指定的字符串解析为浮点数并返回

    如果在解析过程中遇到除正负号,数字,小数点和科学计数法中的指数以外的字符,则会忽略该字符及之后的所有字符,返回当前已经解析到的浮点数,如果第一个字符就不能被解析为数字则返回NaN

    parseFloat("3.14");

    parseFloat("314e-2");

    parseFloat("0.0314E+2);

    parseFloat("3.14more non-digit characters");

    parseFloat(".0");  //0

    parseFloat(".1");  //0.1

    parseFloat("F1");

    Polyfill

    var filterFloat = function(value){

      if( /^(-|+)?([0-9]+(.[0-9]+)?|Infinity)$/.test(value) )

        return Number(value);  

      return NaN;

    }

    Number.ParseInt()  (ES6新增)

    parseInt(string, radix)全局函数,将给定的字符串以指定的基数解析为整数。如果第一个字符都无法被转换为数值类型则返回NaN

    parseInt和parseFloat这两个全局函数的解析原理都是一样的。都是将字符串进行解析并试图返回一个数值或者NaN。如果结果不是NaN那么返回值将看作是radix参数指定的进制下的数,然后将其转换为十进制的数值。如果遇到了不属于radix参数所指定的基数中的字符,那么该字符及其后面的字符都会被忽略。返回已经解析的数值部分。parseInt将截取整数部分。

    如果没有指定基数或者基数为0时,字符串以0x/0X开头表示16进制,以0开头表示8进制或者10进制,取决于浏览器环境,不建议使用这种方式。其余情形则默认为10进制。

    Polyfill

    filterInt = function(value){

      if( /^(-|+)?([0-9]+|Infinity)$/.test(value) )

        return Number(value);

      return NaN;

    }

    总结: 

    parseInt() parseFloat() 与Number.parseInt() Number.parseFloat() 行为完全一致,仅仅是为了减少全局性方法,使得语言逐步模块化。

    ES6关于Number的扩展

    1. 在ES6中,二进制和八进制数值有了新的表示方法

    二进制的表示方法使用0b(0B)

    八进制的表示方法使用0o(0O) 建议不要再使用以前的0前缀表示

    十六进制的表示方法使用0x(0X)

    将字符串转换为数值类型使用Number()

    2. 新增Number.isFinite(), Number.isNaN(), Number.parseInt(), Number.parseFloat(), Number.isInteger()

    3. 新增Number.EPSILON

    引入的目的在于为浮点数计算设置一个误差范围

    function withinErrorMargin(left, right){
        return Math.abs(left-right)<Number.EPSILON;
    }
    
    withinErrorMargin(0.2+0.1, 0.3);
    withinErrorMargin(0.2+0.2, 0.3);

    4. 

  • 相关阅读:
    Spring Boot 使用 Micrometer 集成 Prometheus 监控 Java 应用性能
    Prometheus 通过 consul 实现自动服务发现
    Prometheus 通过 consul 分布式集群实现自动服务发现
    使用 PushGateway 进行数据上报采集
    AlertManager 之微信告警模板,UTC时间错8个小时的解决办法
    Prometheus 监控报警系统 AlertManager 之邮件告警
    Elasticsearch:使用 IP 过滤器限制连接
    Elasticsearch:创建 API key 接口访问 Elasticsearch
    Elasticsearch:反向代理及负载均衡在 Elasticsearch 中的应用
    Kibana:如何周期性地为 Dashboard 生成 PDF Report
  • 原文地址:https://www.cnblogs.com/joyjoe/p/6160677.html
Copyright © 2011-2022 走看看