js Number parseInt parseFloat

1.八进制和十六进制
八进制第一位必须是0,第二位必须是0-7.超出范围将做为十进制来解析。

var octalNum1 = 070;//八进制56
var octalNum2 = 079;//无效八进制,解析为79
var octalNum3 = 08;//无效八进制,解析为8

十六进制前两位必须是0x,后跟0-9或者A-F(大小写均可)

2.JS没有int,ECMAScript会把小数点后面没有任何数字或0的值转化为整数来保存。极大或极小值可以用科学计数法。

var floatNum1 = 3.125e7;//31250000
var floatNum2 = 3e-7;//0.0000003

3.Numer()和一元加减操作符处理相同

Number(true)//1
Number("hello world")//NaN
Number("")//0
Number("000011")//11
Number(null)//0
Number(undefined)//NaN

4.parseInt
参考js中使用位操作符取整有没有什么副作用?
Number.parseInt 默认接收两个参数
第一个参数是默认是 string 类型值,如果不是,会通过抽象的 ToString 强制转化成 string 类型的值。这其中就会有强制类型转换过程中的各种坑。

第二个参数是 number 类型的进制,如果不是,会通过抽象的 ToNumber 强制转化成 number 类型的值,范围是 2-36,通过强制类型转换后如果是其他值会返回 NaN。在 ES5 之前如果没有传入这个参数,会根据第一个参数的开头来判断进制,0 开头的字符串会判断成八进制,也就是 @貘吃馍香 提到的老黄历坑。ES5 之后已经解决,不传这个参数默认十进制。但是这个参数容易被忽略,尤其是在和 map 之类的也容易忽略后续可选参数的函数搭配使用的时候,比如['10', '10', '10', '10'].map(parseInt) // 结果是 [10, NaN, 2, 3]
所以如果只是用 parseInt 来 “取整”,一个良好的习惯是永远记得设置第二个参数为 10

然后就是尽量不要拿 parseInt 去转换一些其他类型的值,如果实在遇到了需要判断结果(比如一些闲的蛋疼的面试官非得要考察这种)那就先对两个参数进行求值,并转换成相应的类型,然后判断。判断的过程可以大致理解为:第一个参数的转换结果去除空白,然后从左往右提取出在第二个参数指定的进制下能够理解的整数部分,并返回这个值在十进制下的值。如果转换失败返回 NaN除了这些情况,parseInt 在 JavaScript 数值允许的范围内都是可以安全使用的

parseInt("1234blue")//1234
parseInt("");//NaN
parseInt(22.5)//22
parseInt("70")//70
parseInt("070")//56
parseInt("08")//0(8是无效的八进制)
parseInt("09")//0(9是无效的八进制)
parseInt("0xA")//10
parseInt("0xf")//15

以下参考为什么 parseInt(0.0000008) === 8?
parseInt接受两个参数,第一个参数是要转换的字符串(忽略空白);第二个参数是多少进制。建议总是加上第二个参数。

parseInt(1000000000000000000000.5, 10); // 1

为什么会这样呢?
parseInt 的第一个类型是字符串,所以会将传入的参数转换成字符串,也就是String(1000000000000000000000.5) 的结果为 '1e+21'。parseInt 并没有将 'e' 视为一个数字,所以在转换到 1 后就停止了。
这也就可以解释 parseInt(0.0000008) === 8

String(0.000008); // '0.000008'
String(0.0000008); // '8e-7'

从上面的程式码可以看出,小于 0.0000001(1e-7) 的数字转换成 String时,会变成科学记号法,再对这个数进行 parseInt操作就会导致这个问题发生。
结论:不要将 parseInt 当做转换 Number 和 Integer 的工具。
再补上一些悲剧:

parseInt(1/0, 19);      // 18
parseInt(false, 16);    // 250
parseInt(parseInt, 16); // 15
parseInt("0x10");       // 16
parseInt("10", 2);      // 2

5.parseFloat
遇到第一个小数点有效,后面的无效。
parseFloat没有第二个参数,只解析十进制

parseFloat("22.34.5")//22.34
parseFloat("1234blue")//1234
parseFloat("0xA")//0
parseFloat("22.5")//22.5
parseFloat("0908.5")//908.5
parseFloat("3.125e7")//31250000

你可能感兴趣的:(js Number parseInt parseFloat)