类型转换是javascript的大坑,也是比较繁琐的一章
Javascript的类型转换非常灵活,程序根据期望可以自动转换一些值,总之全是坑
50+'hello' //'50hello' 数字转换为字符串
'5'*'6' //30 字符串你转换为数字
遇到转换无效的情况,系统返回NaN
10-'x' //NaN
转换表
![](https://img.haomeiwen.com/i2763198/f9446711d6f8f3df.png)
坑
- 数字和字符串连接,数字转换为字符串
- 转换不成功则为NaN
- 与数字运算true转换为1 , false转换为0,
true+false //=1
- 原始值转换为对象使用String(), Number(), Boolean()构造函数,但null和undefined转换为对象会报类型错误TypeError
比较时的转换
在 == 的时候两边也会做转换
false == undefined //true
undefined == false //false
'0'==0 //true
0 == false //true false转换为数字0
'0' == false //true 都转换为数字
以上换为===判断时,结果都为false
显示类型转换
显示类型转换最简单的方法是构造函数Boolean(),Number(),String(),或Object()。
当不通过New调用以上函数时,就会作为类型转换函数。
var x = Number('123')
x //123 原始值
var y = new Number('123')
y //Number {123} 对象
运算符可以用来做类型转换
x+'' // String(x)
+x //Number(x)
!!x //boolean(x)
数字的解析和格式化
Number在toString()时默认为10进制,也可以用参数指定进制18.toString(19)
。
toFixed()
指定小数位数转换为字符串,四舍五入
toExponential()
将数字转换为指数形式的字符串 小数点前只有一位,小数点后位数由参数决定,四舍五入
toPrecision()
根据参数指定的有效位数将数字转换为字符串,如果有效位数小于整数位数,则使用指数计数法,四舍五入。
Number()会将传入的字符串转换为数字直接量,
parseInt()和parseFloat()是全局函数,前者将数字解析为整数,后者将数字解析为浮点数。两者的运算都会忽略首位的空格,尽量截取前面合理的部分,但如果以非法字符开头,将返回NaN。
parseInt('3.54') // 3
parseFloat('3') // 3
parseFloat('3.54') // 3.54
parseInt(' 3abc ') // 3
parseFloat(' 3.54dksd') // 3.54
parseInt(' aa3') // NaN
parseFloat(' aa3.54') /NaN
parseInt可以有第二个参数:进制
parseInt('11',2) //3
对象转换为原始值
对象转换到布尔值的话全部为true,包括值为false的布尔对象。
Boolean(new Boolean(false)) //True
所有对象都有集成了两个转换方法toString()和valueOf()。
一般对象的toString()返回值是[object Object],很多特殊对象自定义了toString()使返回值更有意义,比如数组返回逗号分割的所有元素的字符串,函数返回整个函数定义,等等。
valueOf() 如果对象存在对应的原始值,则返回该原始值,否则返回该对象自身。数组、函数和正则表达式简单的继承了这一原则,而日期则返回毫秒技术(1970年1月1日以来的毫秒数)。
var a = [1,2,3]
a.toString() // '1,2,3'
var s = {name:'Mike',age:18,sex:'male'}
s.toString() // [object Object]
s.valueOf() === s //true
var d = new Date(2017,1,1)
d.valueOf() // 1485878400000
对象到字符串的转换遵循以下步骤:
- toString()
- 没有toString()方法的话调用valueOf()
- 抛出类型错误异常
对象到数字转换遵循以下步骤:
- 如果valueOf()返回原始值,则把这个原始值转换为数字返回
- 否则如果toString()返回原始值,把这个原始值转换为数字返回
- 以上都不行,则抛出类型转换错误
网友评论