zoukankan      html  css  js  c++  java
  • ES6 数值的扩展

    在ES5中,我们存在几个全局函数 isNaN函数,isFinite函数,parseInt函数,parseFloat函数等,对于这些全局函数的使用很简单,就拿isNaN函数来举例。

    ES5中的写法是:

        isNaN(2.5);  //结果:false
        window.isNaN(2.5);//结果:false

     以上两种写法均可,isNaN是全局函数,本身就是属于window对象下的一个方法,所以大部分人会使用第一种写法。

            但是在ES6的标准中,isNaN方法被移植到了Number对象上,也就是原本属于全局对象window下的函数,现在属于Number对象上了,同样被处理的函数还有isFinite函数,parseInt函数,parseFloat函数。

    被移植后的函数使用方式是这样的:

        Number.isNaN(2.5); //结果:false

      Number.isNaN函数:用于判断传入的是否是非数值,注意:是判断非数值,而不是判断数值,IsNaN的全称是: is not a number。

    Number.isNaN(2.5); //结果:false

     由于2.5是一个number类型的数值,所以返回false(再次注意:判断是非数值,所以是false,表示2.5是一个数值类型的值)。

    那么,移植到Number对象isNaN函数和原本是全局函数的isNaN函数,有不一样的地方吗,还是仅仅简单地移植过来就完事了?

            答案:有区别。

            传统的isNaN函数会把非数值的参数转化成数值再进行判断,而Number. isNaN只对数值类型有效,非数值类型的参数一律返回false。看文字解释不过瘾,咱们看案例。

        isNaN('abc');//结果:true
        //'abc'无法转为一个数值,返回true
    
        Number.isNaN('abc'); //结果:false
        //'abc'是字符串,Number.isNaN不做类型转换,直接返回false

    Number.isFinite函数:用来检查一个数值是否非无穷。注意是判断非无穷,不是判断无穷,这里跟isNaN函数一样,有点绕。

     Number.isFinite(1);
        //结果:true,数值1是有穷,即非无穷
    
        Number.isFinite(Infinity);
        //结果:false,Infinity表示无穷大的特殊值

     注意第二行代码的参数:Infinity,Infinity是window对象下的一个常量,表示一个无穷数。所以第二行代码会返回false。此外,isFinite函数跟isNaN函数一样,也只是对数值类型有效,对非数值类型的参数一律返回false。

    Number.isFinite('abc'); //结果:false

     所以同样要注意,当Number.isFinite函数返回false的时候,参数不一定就是一个有穷的数值类型,也有可能是一个非数值类型的参数。如:字符串’abc’。

     parseInt函数:解析一个字符串,返回一个整数。parseInt函数同样是从window对象下移植到Number对象下,但是它的作用没有任何变化。

        //传统用法:
        parseInt('12.3abc');  
        //结果:返回数值12
    
        //ES6用法:
        Number.parseInt('12.3abc');
        //结果:返回数值12

      parseFloat函数:解析一个字符串,并返回一个浮点数。跟parseInt一样,被移植到Number对象下,作用保持不变。

        //传统用法:
        parseInt('12.3abc');
        //结果:返回数值12
    
        //ES6用法:
        Number.parseInt('12.3abc');
        //结果:返回数值12

      Number.isInteger函数:用来判断是否是整数。

        Number.isInteger(3.2);
        //结果:false
    
        Number.isInteger(3);
        //结果:true

    上面的运行结果也如我们所料,数值3.2不是整数,返回false。不过有一点要注意:在javascript内部对整数和浮点数采用一样的存储方式,因此小数点后如果都是0的浮点数,都会被认为是整数。看个例子就知道了:

        Number.isInteger(3.0);
        //结果:true
    
        Number.isInteger(3.00);
        //结果:true

      Number.EPSILON常量:定义一个极小的数值。

      console.log(Number.EPSILON);
        //结果:2.220446049250313e-16

         Number.EPSILON的出现是用来判断浮点数的计算误差,如果浮点数计算得到的误差不超过Number.EPSILON的值,就表示可以接受这样的误差。

    ES6为我们引入了安全整数的概念。什么?整数还有安全和不安全的说法?原来JavaScript能够准确表示的整数范围在-2^53到2^53之间,超过这个范围,无法精确表示这个值。故称之为不安全。

            为此,ES6定义了两个常量来表示这个范围的最大值和最小值:Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER。此外,如果给你一个数值,你不知道它是否超出了这个安全范围,你可以使用ES6给我们新增的一个函数Number.isSafeInteger来进行判断。看例子:

        Number.isSafeInteger(Number.MAX_SAFE_INTEGER);
        //结果:true
    
        Number.isSafeInteger(Number.MAX_SAFE_INTEGER+1);
        //结果:false

            我们用最大安全整数Number.MAX_SAFE_INTEGER来做试验,第一行代码的结果返回的值是true,也就表示Number.MAX_SAFE_INTEGER属于安全范围,第二行代码,我们对Number.MAX_SAFE_INTEGER进行了+1,相加后的数值超过安全范围,isSafeInteger函数就返回了false,表示不在安全范围内。

            ES6给数值带来的扩展,除了对Number对象进行了扩展,还对Math对象进行了扩展。对于Math对象大家应该不会感到陌生,我们平时用的求随机数的方法random就是属于Math对象下的方法

        Math.random();
        //结果:随机数0.8897368770341108

      Math.trunc函数:用于去除一个数的小数部分,返回整数部分。

        Math.trunc(3);
        //结果:3
    
        Math.trunc(3.1);
        //结果:3

    Math.sign函数:用来判断一个数到底是正数、负数、还是零。

        Math.sign(3);
        //结果:1
    
        Math.sign(-3);
        //结果:-1
    
        Math.sign(0);
        //结果:0
    
        Math.sign('abc');
        //结果:NaN

     Math.cbrt函数:用于计算一个数的立方根。

        Math.cbrt(8);
        //结果:2
    
        Math.cbrt(27);
        //结果:3

      除了这三个函数以外,剩下的新增函数都是一些高中时期的数学方法,只不过是ES6将他们的运算封装成一个方法,方便大家使用,也算是开发者的福音。

    它们分别是:

    Math.acosh(x) 返回 x 的反双曲余弦。

    Math.asinh(x) 返回 x 的反双曲正弦。

    Math.atanh(x) 返回 x 的反双曲正切。

    Math.clz32(x) 返回 x 的 32 位二进制整数表示形式的前导 0 的个数。

    Math.sinh(x) 返回x的双曲正弦。

    Math.cosh(x) 返回 x 的双曲余弦。

    Math.expm1(x) 返回 eˆx - 1。

    Math.fround(x) 返回 x 的单精度浮点数形式。

    Math.hypot(...values) 返回所有参数的平方和的平方根。

    Math.imul(x, y) 返回两个参数以 32 位整数形式相乘的结果。

    Math.log1p(x) 返回 1 + x 的自然对数。

    Math.log10(x) 返回以 10 为底的x的对数。

    Math.log2(x) 返回以 2 为底的 x 的对数。

    Math.tanh(x) 返回 x 的双曲正切。

            这么多数学方法,估计很多人都会懵逼,根本记不住这么多,但是没关系,我们也不需要去死记硬背它们,我们只需要记住ES6为Math对象扩展了很多数学方法就可以了。等真正使用到的时候,我们再去查找资料就可以了。

    总结:ES6对Number对象新增了isInteger函数、极小常量Number.EPSILON、安全整数;还将window对象下的4个函数移植到了Number对象下;此外,对Math对象扩展了17个新函数。

  • 相关阅读:
    MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
    MyBatis学习总结(五)——实现关联表查询
    MyBatis学习总结(六)——调用存储过程
    MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
    MyBatis学习总结(二)----使用MyBatis对表执行CRUD操作
    MyBatis学习总结(三)——优化MyBatis配置文件中的配置
    CORS跨域问题
    按指定后缀名删除文件的demo
    Markdown起步
    Linux和git起步
  • 原文地址:https://www.cnblogs.com/whybxy/p/7279972.html
Copyright © 2011-2022 走看看