概念
ES6(ECMAScript 6)对数值的扩展引入了一系列新的特性和方法,旨在提高数值处理的便利性和精确度。以下是ES6数值扩展的主要内容和示例:
1. 二进制、八进制和十六进制字面量
- 二进制:使用
0b
或0B
前缀表示。例如,0b1010
表示二进制的10,即十进制的10。 - 八进制:使用
0o
或0O
前缀表示。例如,0o12
表示八进制的12,即十进制的10。 - 十六进制:ES6本身未直接引入新的十六进制字面量表示法,但传统的十六进制表示(使用
0x
或0X
前缀)仍然有效。例如,0x10
表示十六进制的10,即十进制的16。
数值类型 | 前缀 | 示例 | 十进制等效值 |
---|---|---|---|
二进制 | 0b 或 0B | 0b1010 | 10 |
八进制 | 0o 或 0O | 0o12 | 10 |
十六进制 | 0x 或 0X | 0x10 | 16 |
十六进制(含字母) | 0x 或 0X | 0xA | 10 |
十六进制(组合) | 0x 或 0X | 0x1A | 26 |
// 二进制字面量
let binaryNumber = 0b1010; // 二进制的1010,等于十进制的10
console.log(binaryNumber); // 输出: 10
// 八进制字面量
let octalNumber = 0o12; // 八进制的12,等于十进制的10
console.log(octalNumber); // 输出: 10
// 十六进制字面量(不是ES6新引入,但ES6及其之后版本依然支持)
let hexNumber = 0x10; // 十六进制的10,等于十进制的16
console.log(hexNumber); // 输出: 16
// 额外的十六进制示例,包含字母
let hexNumberWithLetters = 0xA; // 十六进制的A,等于十进制的10
console.log(hexNumberWithLetters); // 输出: 10
// 也可以组合使用数字和字母
let anotherHexNumber = 0x1A; // 十六进制的1A,等于十进制的26
console.log(anotherHexNumber); // 输出: 26
2. Number对象的新方法
-
Number.isFinite() :用于检查一个值是否为有限的数值。与全局的
isFinite()
方法不同,Number.isFinite()
不会尝试将参数转换为数值,而是直接判断。console.log(Number.isFinite(15)); // true console.log(Number.isFinite('15')); // false
-
Number.isNaN() :用于检查一个值是否为
NaN
。与全局的isNaN()
方法不同,Number.isNaN()
不会对参数进行类型转换,只有参数是NaN
时才返回true
。console.log(Number.isNaN(NaN)); // true console.log(Number.isNaN('NaN')); // false
-
Number.parseInt() 和 Number.parseFloat() :作为全局函数
parseInt()
和parseFloat()
的严格版本,直接绑定在Number
对象上。这两个方法的行为与全局函数相同,但目的在于逐步减少全局性方法,使语言模块化。console.log(Number.parseInt("123px")); // 123 console.log(Number.parseFloat("123.45em")); // 123.45
-
Number.isInteger() :用于判断一个值是否为整数。需要注意的是,在JavaScript内部,整数和浮点数是同样的储存方法,所以
3
和3.0
被视为同一个值。console.log(Number.isInteger(42)); // true console.log(Number.isInteger(42.1)); // false
-
Number.EPSILON:提供了一个极小的常量,表示1与大于1的最小浮点数之间的差,用于比较浮点数时的误差容限。
let num = 0.1 + 0.2; console.log(Math.abs(num - 0.3) < Number.EPSILON); // true
-
Number.isSafeInteger() :用于检查一个值是否为安全的整数(在
-(2^53) - 1
到2^53 - 1
之间)。超过这个范围的整数在JavaScript中无法精确表示。console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER)); // true console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1)); // false
3. 数值分隔符
ES6允许在数值中使用下划线(_
)作为分隔符,以提高数值的可读性。这个分隔符可以放在整数部分、小数部分或科学计数法中,但不能放在数值的最前面、最后面,也不能两个或两个以上的分隔符连在一起。
console.log(10000000 === 10_000_000); // true
console.log(0.000_00_1 === 0.000001); // true
console.log(1e10_0_00 === 1e10000); // true
4. Math对象的扩展
ES6还扩展了Math
对象,增加了一些新的方法,如:
- Math.trunc() :用于去除一个数的小数部分,返回整数部分。
- Math.sign() :用于判断一个数是正数、负数还是零。
- Math.cbrt() :用于计算一个数的立方根。
- Math.hypot() :返回所有参数的平方和的平方根。
表格表示
特性/方法 | 描述 | 示例 |
---|---|---|
二进制和八进制字面量表示 | ES6引入了新的字面量表示法来直接表示二进制和八进制数。二进制以0b或0B开头,八进制以0o或0O开头。 | let binary = 0b1010; // 二进制表示10, 十进制为10 let octal = 0o12; // 八进制表示12, 十进制为10 |
Number.isFinite() | 用来检查一个值是否为有限的数值。与全局的isFinite()不同,Number.isFinite()不会尝试将参数转换为数值。 | Number.isFinite(15); // true Number.isFinite(Infinity); // false Number.isFinite('15'); // false |
Number.isNaN() | 用来检查一个值是否是NaN。与全局的isNaN()不同,Number.isNaN()不会尝试将参数转换为数值,并且只有对NaN才返回true。 | Number.isNaN(NaN); // true Number.isNaN(15); // false Number.isNaN('NaN'); // false |
Number.parseInt() 和 Number.parseFloat() | 这两个方法作为全局函数的严格版本,直接绑定在Number对象上,用于将字符串转换为整数或浮点数。 | Number.parseInt("123px"); // 123 Number.parseFloat("123.45em"); // 123.45 |
Number.isInteger() | 用来判断一个值是否为整数。需要注意的是,JavaScript内部整数和浮点数是同样的存储方法,所以3和3.0被视为同一个值。 | Number.isInteger(42); // true Number.isInteger(42.1); // false |
Number.EPSILON | 表示两个可表示数之间的最小间隔,是JavaScript能够表示的最小精度。主要用于浮点数运算时设置误差范围。 | let num = 0.1 + 0.2; console.log(Math.abs(num - 0.3) < Number.EPSILON); // true |
Number.isSafeInteger() | 检查一个值是否为安全的整数(在-(253之间)。超过这个范围,JavaScript无法精确表示这个值。 | Number.isSafeInteger(9007199254740991); // true Number.isSafeInteger(9007199254740992); // false |