【ES6】数值扩展

22 阅读5分钟

概念

ES6(ECMAScript 6)对数值的扩展引入了一系列新的特性和方法,旨在提高数值处理的便利性和精确度。以下是ES6数值扩展的主要内容和示例:

1. 二进制、八进制和十六进制字面量

  • 二进制:使用0b0B前缀表示。例如,0b1010表示二进制的10,即十进制的10。
  • 八进制:使用0o0O前缀表示。例如,0o12表示八进制的12,即十进制的10。
  • 十六进制:ES6本身未直接引入新的十六进制字面量表示法,但传统的十六进制表示(使用0x0X前缀)仍然有效。例如,0x10表示十六进制的10,即十进制的16。
数值类型前缀示例十进制等效值
二进制0b 或 0B0b101010
八进制0o 或 0O0o1210
十六进制0x 或 0X0x1016
十六进制(含字母)0x 或 0X0xA10
十六进制(组合)0x 或 0X0x1A26
// 二进制字面量  
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内部,整数和浮点数是同样的储存方法,所以33.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) - 12^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