• 数值


    原文地址:https://wangdoc.com/javascript/

    概述

    整数和浮点数

    JavaScript内部,所有的数字都是以64位浮点数形式储存,即使整数也是如此。所以11.0是相同的,是同一个数。

    1 === 1.0 // true
    

    也就是说JavaScript语言的底层更本没有整数,所有的数字都是小数。容易造成混淆的是,某些运算只有整数才能完成,此时JavaScript会自动把64位浮点数转成32位整数,然后再进行运算。
    由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。

    0.1 + 0.2 === 0.3 // false
    0.3 / 0.1 // 2.9999999...
    
    (0.3 - 0.2) === (0.2 - 0.1) // false 
    

    数值精度

    JavaScript浮点数的64位,从左边开始是这样组成的。

    • 第1位:符号位,0表示整数,1表示负数
    • 第2位到第12位(共11位):指数部分
    • 第13位到第64位(共52位):小数部分(即有效数字)
      精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即-253到253,都可以精确表示。

    数值范围

    JavaScript能够表示的数值范围为21024到2-1024(开区间),超出这个范围的数无法表示。
    如果一个数大于等于2的1024次方,那么就会发生正向溢出,即JavaScript无法表示这么大的数,这时就会返回Infinity

    Math.pow(2, 1024) // Infinity
    

    如果一个数小于等于2的-1075次方(指数部分最小值-1023,再加上小数部分的52位),那么就会发生负向溢出,即JavaScript无法表示这么小的数,这时会直接返回0。

    Math.pow(2, -1075) // 0
    

    JavaScript提供Number对象的MAX_VALUEMIN_VALUE属性,返回可以表示的具体的最大值和最小值。

    Number.MAX_VALUE
    Number.MIN_VALUE
    

    特殊数值

    正零和负零

    JavaScript内部实际上存在2个0:一个是+0,一个是-0,区别就是64位浮点数表示法的符号位不同。

    -0 === +0 // true
    0 === -0 // true
    0 === +0 // true
    (+0).toString() // "0"
    (-0).toString() // "0"
    (1 / +0) === (1 / -0) // false
    

    上面的代码之所以出现这样结果,是因为除以正零得到+Infinity,除以负零得到-Infinity,这两者是不想等的。

    NaN

    含义

    NaN是JavaScript的特殊值,表示非数字,主要出现在将字符串解析成数字出错的场合。

    5 - 'x' // NaN
    

    宁外,一些数学函数的运算结果会出现NaN。

    Math.acos(2) // NaN
    Math.log(-1) // NaN
    Math.log(-1) // NaN
    0 / 0 // NaN
    

    需要注意的是,NaN不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于Number,使用typeof可以看的很清楚。

    typeof NaN // "number"
    

    NaN,包括它本身。

    NaN === NaN // false
    

    数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立。

    [NaN].indexOf(NaN) // -1
    

    NaN在布尔运算时当做false

    Boolean(NaN) // false
    

    NaN和任何数(包括它自己)的运算,得到的都是NaN

    Infinity

    Infinity有正负之分,Infinity表示正的无穷,-Infinity表示负的无穷。
    Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)。

    与数值相关的全局方法

    parseInt()

    基本用法
    parseInt方法用于将字符串转为整数。

    parseInt("123") //123
    

    如果字符串头部有空格,空格会被自动去除

    parseInt("     81") // 81
    

    如果parseInt的参数不是字符串,则会先转为字符串再转换。字符串转为整数的时候,是一个个字符一次转换,如果遇到不能转为数字的字符就不再进行下去。如果字符串第一个字符就无法转化为数字,就返回NaN

    parseInt("8a") // 8
    parseInt("abc") // NaN
    

    parseInt的返回值只有两种可能,要么是一个十进制整数,要么是NaN
    parseInt可以接受第二个参数(2到36之间),表示被解析的值的进制。超出范围返回NaN。如果第二个参数是0undefinednull,则直接忽略,按10进制返回。
    如果字符串包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。

    parseInt("1567", 2) // 1
    parseInt("567", 2) // NaN
    

    如果parseInt的第一个参数不是字符串,会被先转为字符串。这会导致一些令人意外的结果。

    parseInt(0x11, 36) // 43
    parseInt(0x11, 2) // 1
    // 等同于
    parseInt(String(0x11), 36)
    parseInt(String(0x11), 2)
    // 等同于
    parseInt("17", 36)
    parseInt("17", 2)
    
    parseInt(011, 2)
    // 等同于
    parseInt(String(011), 2)
    // 等同于
    parseInt(String(9), 2) // NaN
    

    parseFloat()

    parseFloat([]) // NaN
    parseFloat("FF2") // NaN
    parseFloat("") // NaN
    

    parseFloat的转换结果不同于Number函数

    parseFloat(true) // NaN
    Number(true) // 1
    
    parseFloat(null) // NaN
    Number(null) // 0
    
    parseFloat("") // NaN
    Number("") // 0
    
    parseFloat("123.45#") // 123.45
    Number("123.45#") // NaN
    

    isNaN

    isNaN可以判断一个值是否为NaN
    **需要注意的是,只有一个数值成员的数组的数组,isNaN返回false

    isNaN([]) // false
    isNaN([123]) // false
    isNaN(["123"]) // false
    

    因此再使用isNaN之前最好判断一下数据类型。

    function myIsNaN(value) {
        return typeof value === "number" || isNaN(value);
    }
    

    判断isNaN更好的方法是利用isNaN是唯一不等于自身的值的这个特点进行判断。

    function myIsNaN(value) {
        return typeof value === "number" || value !== value;
    }
    

    isFinite()

    除了Infinity-InfinityNaNundefined这几个值会返回false,其余的都返回true。

  • 相关阅读:
    springboot+mybatisplus使用xml找不到mapper的解决办法
    PDF转换成Word文档
    Mybatis-Plus增删改查
    Redis 常用命令
    Java 获取两个List<String>中不同的数据
    controller 返回界面 中文乱码
    Navicat已经成功连接,密码忘记的解决方案
    List数组指定切割
    xml字符串转换成Map
    Java 前一个月的最后一天日期计算
  • 原文地址:https://www.cnblogs.com/chris-jichen/p/9926105.html
Copyright © 2020-2023  润新知