parseInt
永远将输入解析为字符串
parseInt({toString: () => 2, valueOf: () => 1}); // -> 2
Number({toString: () => 2, valueOf: () => 1}); // -> 1
一个常见的栗子
parseInt("apple"); // -> NaN
parseInt("apple", 16); // -> 10
上面这个例子是因为parseInt
会一个个解析字符直到解析不了,所以解析十六进制中的a
为10作为结果返回。
parseInt Infinity
parseInt("Infinity", 10); // -> NaN
// ...
parseInt("Infinity", 18); // -> NaN...
parseInt("Infinity", 19); // -> 18
// ...
parseInt("Infinity", 23); // -> 18...
parseInt("Infinity", 24); // -> 151176378
// ...
parseInt("Infinity", 29); // -> 385849803
parseInt("Infinity", 30); // -> 13693557269
// ...
parseInt("Infinity", 34); // -> 28872273981
parseInt("Infinity", 35); // -> 1201203301724
parseInt("Infinity", 36); // -> 1461559270678...
parseInt("Infinity", 37); // -> NaN
parseInt null
parseInt(null, 24); // -> 23
上面的结果都是一样的解析过程,按字母表排序,每个字符对应数字是固定的。比如,I
对应18,在18进制中只能解析0-17,所以parseInt("Infinity", 18); // -> NaN
,在19进制中就能解析出结果:parseInt("Infinity", 19); // -> 18
n
对应23,在23进制中解析不了,只返回18,在24进制中就是18 * (24 ^ 5) + 23 * (24 ^ 4)+ 15 * (24 ^ 3)+ 18 * (24 ^ 2) + 23 * 24 + 18 = 151176378,其他依此类推。
八进制
parseInt("08"); // -> 8, 支持ES5
parseInt("08"); // -> 0, 不支持ES5
以0开头的数字可以被解析为10进制或8进制,ECMAScript 5规定为10进制,但不是所有浏览器都支持它。所以使用parseInt
时指定进制是好习惯,有时可以避免不必要的bug。
浮点数
parseInt(0.000001); // -> 0
parseInt(0.0000001); // -> 1
parseInt(1/1999999); // -> 5
parseInt
接受一个字符串参数并返回一个指定基数的整数。 parseInt
还会去除字符串参数中第一个非数字之后的任何内容。0.000001转换为字符串后是"0.000001",0.0000001转换后是"1e-7",所以返回1,1/1999999转换后是5.00000250000125e-7,返回结果是5。