[数字]
根据语言规范,JavaScript 采用“遵循 IEEE 754 标准的双精度 64 位格式”("double-precision 64-bit format IEEE 754 values")表示数字。——在 JavaScript(除了[BigInt])当中,**并不存在整数/整型 (Integer)。**因此在处理如下的场景时候,您一定要小心:
console.log(3 / 2); // 1.5,not 1
console.log(Math.floor(3 / 2)); // 1
一个看上去是整数的东西,其实都是浮点数。
当然,您也需要小心这种情况:
0.1 + 0.2 = 0.30000000000000004
你可以使用内置函数 [parseInt()] 将字符串转换为整型。该函数的第二个可选参数表示字符串所表示数字的基(进制):
JSCopy to Clipboard
parseInt("123", 10); // 123
parseInt("010", 10); // 10
一些老版本的浏览器会将首字符为“0”的字符串当做八进制数字,2013 年以前的 JavaScript 实现会返回一个意外的结果:
JSCopy to Clipboard
parseInt("010"); // 8
parseInt("0x10"); // 16
这是因为字符串以数字 0 开头,[parseInt()]函数会把这样的字符串视作八进制数字;同理,0x 开头的字符串则视为十六进制数字。
如果想把一个二进制数字字符串转换成整数值,只要把第二个参数设置为 2 就可以了:
parseInt("11", 2); // 3
JavaScript 还有一个类似的内置函数 [parseFloat()],用以解析浮点数字符串,与[parseInt()]不同的地方是,parseFloat() 只应用于解析十进制数字。
一元运算符 + 也可以把数字字符串转换成数值:
+"42"; // 42
+"010"; // 10
+"0x10"; // 16
如果给定的字符串不存在数值形式,函数会返回一个特殊的值 [NaN](Not a Number 的缩写):
parseInt("hello", 10); // NaN
可以使用内置函数 [isNaN()]来判断一个变量是否为 NaN:
isNaN(NaN); // true
JavaScript 还有两个特殊值:[Infinity](正无穷)和 -Infinity(负无穷):
JSCopy to Clipboard
1 / 0; // Infinity
-1 / 0; // -Infinity
可以使用内置函数 [isFinite()] 来判断一个变量是否是一个有穷数,如果类型为Infinity, -Infinity 或 NaN 则返回 false:
JSCopy to Clipboard
isFinite(1 / 0); // false
isFinite(Infinity); // false
isFinite(-Infinity); // false
isFinite(NaN); // false
isFinite(0); // true
isFinite(2e64); // true
isFinite("0"); // true
// 如果是纯数值类型的检测,则返回 false:
Number.isFinite("0"); // false