最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 重新认识number类型

    正文概述 掘金(颜酱)   2021-06-01   963

    最近一直在看《你不知道的JS》,看到number类型,觉得有些东西之前不清楚,轻总结了下。

    number类型包括“整数”值和小数值。

    但“整数”只是一个没有小数部分的小数值

    TL;DR

    • number默认是十进制,并去掉末尾小数部分的0
    • 二进制、八进制、十六进制:以特殊的0b 0o 0x开头
    • 非常大或者小的数,可以用指数表示:5e10
    • 严格控制小数的位数:toFixed,会四舍五入或补0
    • 小数有误差,比较的时候,可以用容差const isEqual = (n1,n2) => Math.abs( n1 - n2 ) < Number.EPSILON
    • JS能表示的最大正负整数是有限的,15位数以内都是很安全的。ID超过15位的时候,记得用字符串。
    • NaN是数字类型,但表示”非法数字“,且和自身不相等,但是Number.isNaN(NaN) === true
    • Infinity-Infinity表示无穷,1/0 === Infinity1/InFinity === 0

    十进制

    默认情况下,大多数 number 将会以十进制小数的形式输出,并去掉末尾小数部分的 0

    var a = 42.0;
    var b = 42.3000;
    a; // 42
    b; // 42.3
    

    重新认识number类型

    其他进制的表示方式:尽量小写

    • 二进制(0b):0b11101
    • 八进制(0o):0o11101
    • 十六进制(0x):0x11101

    推荐,用小写字母,这样易识别,虽然可以大写,但是0O可读性低。

    指数形式:5E5、toExponential

    非常大或者非常小,可以用指数表示。

    5E5是一个number类型,表示50000,E表示为10的几次方。 但是toExponential返回的是string类型

    // 5 * (10^5)
    var a = 5E5;
    a; // 500000
    a.toExponential(); // "5e+10"
    

    限制小数的位数:toFixed

    当原来的小数位多于指定的位数,会四舍五入 当原来的小数位少于指定的位数,会补0

    但注意,返回值是string类型

    var a = 42.59;
    
    a.toFixed( 0 ); // "43"
    
    a.toFixed( 1 ); // "42.6"
    
    a.toFixed( 3 ); // "42.590"
    
    

    小数值:小数有误差,比较的时候一定慎重

    JS里整数的计算是正确的,但是小数的计算是有误差的。

    0.1 + 0.2 === 0.3
    // false
    

    JS 的 number 的实现基于“IEEE 754”标准,简单的说,就是小数的表示肯定有误差,只是误差极小。

    如果相比较两个小数的话,需使用一个很小的“错误舍入”值作为比较的 容差。这个很小的值经常被称为“机械极小值(machine epsilon)”,大约是为 2^-52:

    function isEqual(n1,n2) {
      return Math.abs( n1 - n2 ) < Number.EPSILON;
    }
    isEqual(0.1+0.2,0.3) // true
    

    安全的整数范围:15位数以下肯定是安全的

    JS并不能表示任意位的整数,最大的整数是Number.MAX_SAFE_INTEGER(9007199254740991),最小的整数是Number.MIN_SAFE_INTEGER(-9007199254740991)

    特别注意,很多ID是超出这个范围的,所以ID最好是用string,当ID超出**15**位数的话,就肯定要用字符串类型了。

    那超出会怎么样呢,会不准滴!

    var a = 9007199254740995
    a; // 9007199254740996
    

    测试是不是整数:Number.isInteger

    这里我觉得有坑啦,比如希望用户输入整数,别用这个

    因为xx.0,有小数位,但是它觉得就是整数。

    Number.isInteger( 42 );		// true
    Number.isInteger( 42.000 );	// true
    Number.isInteger( 42.3 );	// false
    

    NaN:number类型,表示非正常的数字

    NaN 是一种“哨兵值”(一个被赋予了特殊意义的普通的值),试着进行数学操作但是失败了,而这就是失败的 number 结果。

    var a = 1/"foo"
    a;  // NaN
    

    注意:NaN,永远不等于自己。也是JS里唯一自己不等于自己的。

    NaN === NaN // false
    

    判断是不是NaN:Number.isNaN

    Number.isNaN(1/'foo') // true
    
    Object.is(NaN,NaN) // true
    

    Infinity:表示无穷

    数学里,0是不允许做除数的!!!

    但是JS里,任意非0的数除以0,值是Infinity

    而任意非0的数除以Infinity,都是0或者-0

    1/0  // Infinity
    -1/0  // -Infinity
    
    1/Infinity  // 0
    -1/Infinity   // -0
    
    
    0 === -0  // true
    Object.is(0,-0)  // false
    

    虽然-0 === 0Object.is(0,-0)是false,也就是这两并不完全等价,-0有其本身的意义,比如做动画的时候,表示移动的方向。 不过我觉得大部分开发者,可以忽略,=。=

    其他属性和方法

    重新认识number类型

    MDN关于Number的介绍。

    Number本身也值得一说,其是个函数

    • 单独调用,表示将参数转化成数字,无法转化则返回NaN
    • 作为构造函数调用,创建number类型的对象
    • 作为对象,有其属性和方法

    起源地下载网 » 重新认识number类型

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元