分类: javascript 4880阅读阅读模式
1、转换函数
JS 提供了 parseInt()
和 parseFloat()
两个转换函数。parseInt()
把值转换成整数,parseFloat
把值转换成浮点数。
只有对 String 类型调用这两个函数才能正确运行;对其他类型返回的都是 NaN(Not a Number) 。
如下:
- parseInt("0xA"); // 10
- parseInt("12.34"); // 12
- parseInt("12.3.5"); // 12
- parseInt("123darlang"); // 123
- parseInt("darlang"); // NaN
- parseInt("darlang123"); // NaN
parseInt()
方法还有基模式,可以把二进制、八进制、十六进制等(2-36进制)的字符串转换成整数。基是由 parseInt()
方法的第二个参数指定的。
如下:
- parseInt("16", 8); // 14 (1*8^1+6*8^0)
- parseInt("10F", 8); // 8 「F被干掉了」
- parseInt("10", 2); // 2 (1*2^1+0*2^0)
- parseInt("darlang",16); // 218 = da 「rlang被干掉了」
- parseInt("10", 10); // 10
由于 parseInt()
的特性,总会从左往右拿符合的值。
如 8/10 进制时,它会从左往右拿值数字的值,字母是无效的,如果都没有符合的值,就会返回 NaN 。这就是为什么 10F 只返回 10 的值。
而当 16 进制时,它会从左往右拿值数字以及A-F的值,其他字母是无效的,如果都没有符合的值,就会返回 NaN
。这就是为什么 darlang
只返回 da
的值,因为碰到了 r ,识别到时无效的,就终止了寻值并返回 da 的有效转换值 218 了。
还有个值得注意的是,如果为 10 进制时,数字前带有 0 可能会被意外的转换成 8 进制。
如下:
- parseInt("10"); // 10
- parseInt("010"); // 8
- parseInt("010", 8); // 8
- parseInt("010", 10); // 10
parseFloat()
方法与 parseInt()
方法的比较相似。不同之处在于 parseFloat()
处理字符串必须以十进制形式表示浮点数,同时它没有基模式。
拿第一个示例用换成 parseFloat ,如下:
- parseFloat("0xA"); // 0
- parseFloat("12.34"); // 12.34
- parseFloat("12.3.4"); // 12.3
- parseFloat("123darlang"); // 123
- parseFloat("darlang"); // NaN
- parseFloat("darlang123"); // NaN
可以看出,字母完全不起作用了,浮点数只取有效值,如 12.3.4
后面这个 .4
明显的不是有效的值,也就是说 parseFloat()
只会去第一个小数点后面的有效数字。
2、强类型转换
js 中有三个强类型转换的方法,分别是 Number()
转换为数字, String()
转换为字符串, Boolean()
转化为布尔值。
本节讲的是 Number()
这个方法,它将任何合法的数字字符串(String)转为数字(Number)类型。
如下:
- Number(12);// 12
- Number("12");// 12
- Number("12.34");// 12.34
- Number("12.3.4");// NaN
- Number("Infinity");// Infinity
- Number();// 0
- Number('0x11');// 17
- Number('');// 0
- Number(false);// 0
- Number(true);// 1
- Number(undefined);// NaN
- Number(null);// 0
- Number([]);// 0
- Number([12]);// 12
- Number('darlang');// NaN
- Number(new Object());// NaN
根据代码运行结果,越看越不对劲是不,不是说好的合法的数字字符串转换吗?
其实,合法数字字符串包含 16 进制、布尔值(0代表false、1代表true)、无穷数等这些都是合法的数字。
好吧,勉强的说法,但其中的数组空数组 js 会转为 0 ,数组中的数字转为数值,这个数组只能存在一个值,如 [12,34]
这种直接返回 NaN ,打扰了。
对于处理多位小数点与 parseFloat()
相类似,会直接返回 NaN 。
undefined
的处理,理论来说应该是 false => 0 会返回 0 ,其实不是,参考JS规范中的这节:传送门==>The Abstract Equality Comparison Algorithm
3、弱类型转换
弱类型转换总的来说就是通过算术进行类型的转换,这个方法不推荐。
在类型转换时,既然是“弱”,说明会容易出错,如下:
- console.log('1234'-0,typeof('1234'-0));// 1234,number
- console.log('12.4'+0,typeof('12.4'+0));// 12.40,string
- console.log('1234'*1,typeof('1234'*1));// 1234,number
- console.log('1234'-0,typeof('1234'-0));// 1234,number
- console.log('1234'-1,typeof('1234'-1));// 1233,number
- console.log('12.4'+1,typeof('12.4'+1));// 12.31,string
- console.log('1234'*1,typeof('1234'*1));// 1234,number
- console.log('1234'-1,typeof('1234'-1));// 1233,number
- console.log('darlang'-0,typeof('darlang'-0));// NaN,number
- console.log('darlang'+1,typeof('darlang'+1));// darlang1,string
- console.log('darlang'*1,typeof('darlang'*1));// NaN,number
- console.log('darlang'-1,typeof('darlang'-1));// NaN,number
在类型转换的时候,遇到小数时并不能转为数值,遇到字母时,如 + 号会变成连接符,直接连接二者。
参考:
https://juejin.im/post/5b076c006fb9a07aa43c9fda
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number
JavaScript 类型转换 https://www.runoob.com/js/js-type-conversion.html
JavaScript parseInt() 函数 http://www.w3school.com.cn/js/jsref_parseInt.asp
相关评论 当前评论 1 条 [ 游客 1 | 博主 0 ]
你好,测试回复