3.4.5 Number 类型

3.4.5 Number 类型

Number 类型使用 IEEE 754格式表示整数和浮点值(在某些语言中也叫双精度值)。不同的数值类型相应地也有不同的数值字面量格式。

最基本的数值字面量格式是十进制整数,直接写出来即可。

整数也可以用八进制(以 8 为基数)或十六进制(以 16 为基数)字面量表示。

对于八进制字面量,第一个数字必须是零(0),然后是相应的八进制数字(数值 0~7)。如果字面量中包含的数字超出了应有的范围,就会忽略前缀的零,后面的数字序列会被当成十进制数。

八进制字面量在严格模式下是无效的,会导致 JavaScript 引擎抛出语法错误。

    1. 浮点值
      • 要定义浮点值,数值中必须包含小数点,而且小数点后面必须至少有一个数字。
      • 因为存储浮点值使用的内存空间是存储整数值的两倍,所以 ECMAScript 总是想方设法把值转换为整数。在小数点后面没有数字的情况下,数值就会变成整数。
      • 对于非常大或非常小的数值,浮点值可以用科学记数法来表示。科学记数法用于表示一个应该乘以10 的给定次幂的数值。
    2. 值的范围
      • 由于内存的限制,ECMAScript 并不支持表示这个世界上的所有数值。ECMAScript 可以表示的最小数值保存在 Number.MIN_VALUE 中,这个值在多数浏览器中是 5e324;可以表示的最大数值保存在Number.MAX_VALUE 中,这个值在多数浏览器中是 1.797 693 134 862 315 7e+308。如果某个计算得到的数值结果超出了 JavaScript 可以表示的范围,那么这个数值会被自动转换为一个特殊的 Infinity (无穷)值。任何无法表示的负数以 -Infinity (负无穷大)表示,任何无法表示的正数以 Infinity (正无穷大)表示。
    3. NaN
    • 有一个特殊的数值叫 NaN ,意思是“不是数值”(Not a Number),用于表示本来要返回数值的操作失败了(而不是抛出错误)。比如,用 0 除任意数值在其他语言中通常都会导致错误,从而中止代码执行。但在 ECMAScript 中,0、+0 或0 相除会返回 NaN。
    • 如果分子是非 0 值,分母是有符号 0 或无符号 0,则会返回 Infinity 或 -Infinity。
    • NaN 有几个独特的属性:
      • 任何涉及 NaN 的操作始终返回 NaN (如 NaN/10 )
      • NaN 不等于包括 NaN 在内的任何值
      • ECMAScript 提供了 isNaN() 函数。该函数接收一个参数,可以是任意数据类型,然后判断这个参数是否“不是数值”。
    1. 数值转换
      • 有 3 个函数可以将非数值转换为数值:
        • Number()
          • Number() 函数基于如下规则执行转换:
            1. 布尔值, true 转换为 1, false 转换为 0。
            2. 数值,直接返回。
            3. null ,返回 0。
            4. undefined ,返回 NaN 。
            5. 字符串,应用以下规则:
              • 如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。因此, Number("1") 返回 1, Number("123") 返回 123,Number("011") 返回 11(忽略前面的零)。
              • 如果字符串包含有效的浮点值格式如 "1.1" ,则会转换为相应的浮点值(同样,忽略前面的零)。
              • 如果字符串包含有效的十六进制格式如 "0xf" ,则会转换为与该十六进制值对应的十进制整数值。
              • 如果是空字符串(不包含字符),则返回 0。
              • 如果字符串包含除上述情况之外的其他字符,则返回 NaN 。
            6. 对象,调用 valueOf() 方法,并按照上述规则转换返回的值。如果转换结果是 NaN ,则调用toString() 方法,再按照转换字符串的规则转换。
        • parseInt()
          • parseInt() 函数更专注于字符串是否包含数值模式。字符串最前面的空格会被
            忽略,从第一个非空格字符开始转换。如果第一个字符不是数值字符、加号或减号, parseInt() 立即返回 NaN 。这意味着空字符串也会返回 NaN (这一点跟 Number() 不一样,它返回 0)。如果第一个字符是数值字符、加号或减号,则继续依次检测每个字符,直到字符串末尾,或碰到非数值字符。比如,"1234blue" 会被转换为 1234,因为 "blue" 会被完全忽略。类似地, "22.5" 会被转换为 22,因为小数点不是有效的整数字符。
          • 假设字符串中的第一个字符是数值字符, parseInt() 函数也能识别不同的整数格式(十进制、八进制、十六进制)。换句话说,如果字符串以 "0x" 开头,就会被解释为十六进制整数。如果字符串以 "0"开头,且紧跟着数值字符,在非严格模式下会被某些实现解释为八进制整数。
          • 不同的数值格式很容易混淆,因此 parseInt() 也接收第二个参数,用于指定底数(进制数)。
        • parseFloat()
          • parseFloat() 函数的工作方式跟 parseInt() 函数类似,都是从位置 0 开始检测每个字符。同样,它也是解析到字符串末尾或者解析到一个无效的浮点数值字符为止。这意味着第一次出现的小数点是有效的,但第二次出现的小数点就无效了,此时字符串的剩余字符都会被忽略。因此, "22.34.5" 将转换成 22.34。
          • parseFloat() 函数的另一个不同之处在于,它始终忽略字符串开头的零。这个函数能识别前面讨论的所有浮点格式,以及十进制格式(开头的零始终被忽略)。十六进制数值始终会返回 0。因为parseFloat() 只解析十进制值,因此不能指定底数。最后,如果字符串表示整数(没有小数点或者小数点后面只有一个零),则 parseFloat() 返回整数。

学习下一篇文章

你可能感兴趣的:(3.4.5 Number 类型)