JavaScript Number 数字对象-数据类型

1let intNum = 55; // 整数
2
3// 八进制字面量,第一个数字必须是零(0),然后是相应的八进制数字(数值0~7)
4let octalNum1 = 070; // 八进制的56
5let octalNum2 = 079; // 无效的八进制值,当成79 处理
6let octalNum3 = 08; // 无效的八进制值,当成8 处理
7
8// 十六进制字面量,必须让真正的数值前缀0x(区分大小写),然后是十六进制数字(0~9 以及A~F)
9let hexNum1 = 0xa; // 十六进制10
10let hexNum2 = 0x1f; // 十六进制31
  • 浮点值

科学记数法的格式跟一个大写或小写的字母 e,再加上一个要乘的 10 的多少次幂,浮点值的精确度最高可达 17 位小数

1let floatNum1 = 1.1;
2let floatNum2 = 0.1;
3let floatNum3 = 0.1; // 有效,但不推荐
4let floatNum1 = 1; // 小数点后面没有数字,当成整数1 处理
5let floatNum2 = 10.0; // 小数点后面是零,当成整数10 处理
6let floatNum = 3.125e7; // 等于31250000
  • 方法
1const num = 10
2num.toString() // '10'
3num.toString(2) // 2 进制转换
4
5num.toFixed(2) // 保留几位小数,最大 20 位小数
6num.toExponential(1) // 1.0e+1 科学计数法
7const num1 = 99
8num1.toPrecision(1) // 1e+2 向上舍入为 100
9num1.toPrecision(2) // 99
10num1.toPrecision(3) // 99.0
  • NaN

分子是非 0 值,分母是有符号 0 或无符号 0,则会返回 Infinity 或-Infinity

1console.log(0 / 0) // NaN
2console.log(-0 / +0) // NaN
3console.log(5 / 0) // Infinity
4console.log(5 / -0) // -Infinity

isNaN 首先会调用对象的 valueOf() 方法,然后再确定返回的值是否可以转换为数值。如果不能,再调用 toString() 方法,并测试其返回值

Number.isFinite()

  • 没有隐式的 Number() 类型转换,所有非数值都返回 false
  • 检查一个数值是否为有限的( finite ),即不是 Infinity
1Number.isFinite(1) // true
2Number.isFinite(0.1) // true
3Number.isFinite(Number.NaN) // false 不是有限的

Number.isInteger()

  • 判断一个数是不是整数
1Number.isInteger(0) // true
2// JavaScript 内部,整数和浮点数采用的是同样的储存方法,因此 1 与 1.0 被视为相同的值
3Number.isInteger(1) // true
4Number.isInteger(1.0) // true

数值转换

  • null,返回 0。
  • undefined,返回 NaN。
  • 字符串:
    • Number("1")返回 1,Number("123")返回 123,Number("011")返回 11
    • 浮点数同样忽略前面的 0
    • 16 进制转换为对应的 10 进制整数值
  • 对象,调用 valueOf()方法,再执行上面的规则。如果是 NaN,则调用 toString()方法,再按照字符串的规则转换。
1const num1 = Number('Hello world!') // NaN
2const num2 = Number('') // 0
3const num3 = Number('000011') // 11
4const num4 = Number(true) // 1
  • parseInt()
    • 字符串最前面的空格会被忽略
    • 第一个字符不是数值、加号或减号,立即返回 NaN
1const num1 = Number.parseInt('1234blue') // 1234
2const num2 = Number.parseInt('') // NaN
3const num3 = Number.parseInt('0xA') // 10,解释为十六进制整数
4const num4 = Number.parseInt(22.5) // 22
5const num5 = Number.parseInt('70') // 70,解释为十进制值
6const num6 = Number.parseInt('0xf') // 15,解释为十六进制整数
  • parseInt()也接收第二个参数,指定进制数
1let num = parseInt('0xAF', 16); // 175
2// 提供了十六进制参数,那么字符串前面的"0x"可以省掉:
3let num1 = parseInt('AF', 16); // 175
4let num1 = parseInt('10', 2); // 2,按二进制解析
5let num2 = parseInt('10', 8); // 8,按八进制解析
6let num3 = parseInt('10', 10); // 10,按十进制解析
  • parseFloat 解析到一个无效的浮点数值字符为止
    • 始终忽略字符串开头的零
    • 十六进制数值始终会返回 0,因为 parseFloat() 只解析十进制值
1const num1 = Number.parseFloat('1234blue') // 1234,按整数解析
2const num2 = Number.parseFloat('0xA') // 0
3const num3 = Number.parseFloat('22.5') // 22.5
4const num4 = Number.parseFloat('22.34.5') // 22.34
5const num5 = Number.parseFloat('0908.5') // 908.5
6const num6 = Number.parseFloat('3.125e7') // 31250000