Skip to main content

Number 类型

十进制

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

let intNumber = 55; //整数

八进制

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

let octalNumber1 = 070; //八进制56
let octalNumber2 = 079; //无效的八进制值,当成79处理
let octalNumber3 = 08; //无效的八进制值,当成8处理

八进制 字面量在严格模式下是无效的,会导致 JavaScript 引擎抛出语法错误,需要通过前缀 0o 来表示。

十六进制

如果要创建十六进制字面量,必须以 0x 作为数值的前缀,然后是十六进制 (0~9 以及 A ~ F) 十六进制数字中的字母大小写均可。

let hexNumber1 = 0xa; //十六进制10
let hexNumber2 = 0x1f; //十六进制31

浮点数

要定义浮点数,数值中必须包含小数点,而且小数点后面必须至少要有一个数字。

let floatNumber1 = 1.1;
let floatNumber2 = 0.1;

因为浮点值需要额外的空间来存储小数部分、指数部分和符号位,所以导致存储浮点值的使用的内存是存储的整数的两倍。 所以 ECMAScript 总是想法设法把值转成整数计算。如果小数点后面没有数字的情况下,数值就会变成整数

let floatNumber1 = 1. => 1 //小数点后面没有数字,当成整数1处理;
let floatNumber2 = 10.0 ; //小数点后面是零,当成整数0处理;

对于非常大或非常小的数值,浮点值可以用科学记数法来表示。科学记数法用于表示一个应该乘以 10 的给定次幂。 ECMAScript中科学记数法的格式 要求是一个数值 后面跟一个大写或者小写的 e,再加上一个要乘的 10 的多少次幂。

let floatNumber = 3.125e7; // 31250000

科学记数法也可以用于表示非常小的数值,例如 0.000 000 000 000 000 03 这个数值用科学记数法表示 3e-17

浮点值的精确度最高可达 17 位小数,但在算术计算中远不如整数精确。例如 0.1+0.2 得到的不是 0.3,而是0.300 000 000 000 000 04。 所以永远不要测试某个特定的浮点值。

值的范围

由于的内存限制 ECMAScript 并不支持表示这个世界上的所有数值,

  • ECMAScript可以表示的最小值保存在 Number.MIN_VALUE 中。这个值在多数浏览器中是 5e-324(大约 6-7 位的有效数字)。

  • ECMAScript可以表示的最大数值保存在Number.MAX_VALUE。这个值在多数浏览器中是 1.7976931348623157e+308(大约 15 位的有效数字)

  • 如果一个数大于任何有限值的情况 这个数值会被自动转换为一个特殊的 Infinity(表示无穷大)

  • 如果一个数小于任何有限值的情况 这个数值会被自动转换为一个特殊的 -Infinity(表示负无穷大)

  • 如果计算返回 Infinity或者-Infinity 则这个值将不能用于任何计算,要确定一个值是不是有限大(即介于 JavaScript 能表示的最小值和最大值之间), 可以使用 isFinite()函数

    let result = Number.MAX_VALUE + Number.MAX_VALUE;
    console.log(isFinite(result)); //false
  • 也可以使用 Number.NEGATIVE_INFINITYNumber.POSITIVE_INFINITY 获取正,负 Infinity

NaN

有一个特殊的值叫 NaN 意思是“不是数值“ (Not a Number),用于表示本来要返回数值的操作失败了(而不是抛出错误)。

  • ECMAScript 中 0,+0 或-0 相处会返回 NaN

    console.log(0 / 0); //NaN
    console.log(-0 / +0); //NaN
  • 如果分子是非零值 分母是 0 则会返回 Infinity或者-Infinity

    console.log(5 / 0); //Infinity
    console.log(5 / -0); //-Infinity
  • 任何涉及到 NaN 的操作始终返回 NaN如 (NaN/10),

  • NaN 不等于 包括NaN在内的任何值

    console.log(NaN === NaN); //false
  • ECMAScript 提供了isNaN() 函数,这个函数接受一个参数,可以是任意数据类型,然后判断这个参数是否“不是数值”,把一个值传给isNaN()后, 该函数会尝试会把它转换为数值,某些非数值的值可以直接转换为数值,如字符串“10”或者布尔值,任何不能转换为数值的都会返回 true

    console.log(isNaN(NaN)); //true
    console.log(isNaN(10)); //false 10是数值
    console.log(isNaN("10")); //false 可以转换为数值10
    console.log(isNaN("blue")); //true 不可以转换为数值
    console.log(isNaN(true)); //false 可以转换为数值1

数值转换

Number()

可以用于任何数据类型

  • 布尔值 true 返回 1,false 返回 0

    console.log(Number(true)); // 1
    console.log(Number(false)); // 0
  • 数值直接返回

  • null 返回 0

    console.log(Number(null)); // 0
  • undefined 返回 NaN

  • 字符串使用于以下规则

    • 如果字符串包含数值字符,包括数值字符串前面带加,减的情况,则转换为一个十进制数值

      console.log(Number("1")); // 1
      console.log(Number("011")); // 11 忽略前面的0
    • 如果字符串包含有效的浮点值格式 则会转成对应的浮点值 同样也会忽略前面的零

      console.log(Number("1.1")); // 1.1
    • 如果字符串包含有效的十六进制格式如”0xf“,或者八进制“0o17” 则会转换成与该十六进制/八进制对应的十进制的整数值

      console.log(Number("0xf")); // 15
      console.log(Number("0o17")); // 15
    • 如果是空字符串(不包含字符),则返回 0;

      console.log(Number("")); // 0
    • 如果字符串包含除上述情况之外的其他字符串 返回 NaN

  • 对象, 调用valueOf()方法返回的是一个原始值(比如数字)并按照上述规则转换返回的值,如果 valueOf() 方法返回的仍然是一个对象 则调用 toString() 方法 在按照字符串的规则转换

console.log(
Number({
valueOf: () => {
return 1;
},
}) + 2
); // 3

Number.parseInt()

考虑到用 Number() 函数转换字符串时相对复杂并且有点反常规,通常在需要得到整数的时可以优先使用 parseInt() 函数。 parseInt()函数更加专注于字符串是否包含数值模式。

  • 字符串最前面的空格会被忽略,从第一个非空格字符串开始转换。如果第一个字符串不是 加号 或者 减号 parseInt()会立即返回NaN

    console.log(Number.parseInt("011")); // 11
    console.log(Number.parseInt("+019")); // 19
    console.log(Number.parseInt("")); // NaN Number('')返回0
    console.log(Number.parseInt(null)); // NaN Number(null)返回0
  • 如果第一个字符时数值字符,加号 或者 减号 则继续依次每个字符,直到字符串末尾,或者碰到非数值字符

    console.log(Number.parseInt("1234blue")); // 1234
  • parseInt() 函数也能识别不同的整数格式(十进制,八进制,十六进制)。

    console.log(Number.parseInt("0xf")); // 15
  • 不同的数值格式很容易混淆 parseInt()函数 因此parseInt()也接收第二个参数用于指定底数(进制数) 如果未提供第二个参数或者将其设置为 0,则根据给定的字符串来自动判断其进制。

    console.log(Number.parseInt("0xAF", 16)); // 15 按照16进制解析
    console.log(Number.parseInt("10", 2)); // 2 按照2进制解析
    console.log(Number.parseInt("10", 8)); // 8 按照8进制解析
    console.log(Number.parseInt("AF")); // NaN
    console.log(Number.parseInt("123", 10)); // 123

    Number.parseFloat()

    parseFloat() 函数的工作方式和 parseInt() 函数类似 都是从位置 0 开始检测每个字符, 同样它也是解析到字符串末尾或者解析到无效的浮点字符串为止。 parseFloat()函数只能解析十进制的值 所以不能指定进制

    console.log(Number.parseFloat("0xA")); // 0
    console.log(Number.parseFloat("1234blue")); // 2 1234
    console.log(Number.parseFloat("22.5")); // 22.5