1、JavaScript中有5种简单数据类型:Undefined、Null、Boolean、Number和String。还有一种复杂数据类型Object。
在使用中这几种数据类型的转换共有如下几种情况:
转换成Boolean、Number、String
一、其它几种类型转换成Boolean的情况下遵循如下规则:
数据类型 | 转换为true的值 | 转换为false的值 |
Boolean | true | false |
String | 任何非空字符串 | '' 空字符串 |
Number | 任何非0数字(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | Undefined |
二、其它几种类型转换成Number的情况下遵循如下规则:
1、如果Boolean值,true和false将分别被转换 为1和0
2、如果是数字值,只是简单的传入和返回
3、如果是null,返回0
4、如果是Undefined,返回NaN
5、如果是String,会将该String调用trim()方法,如果为空字符串则返回0,如果为一个数值形式的字符串就返回该数值,否则返回NaN
6、如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值,如果没有valueOf()方法就调用对象的toString()方法然后按照前面的规则转换返回值
三、其它几种类型转换成String的情况下遵循如下规则:
1、如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
2、如果是null,则返回'null'
3、如果是undefined,则返回'undefined'
小总结:由上面可以看到对象可以转换成Boolean、Number、String,当对象转换成Boolean的时候比较简单,可是当什么时候对象应当转换成Number,什么时候对象应当转换成String那?
1、个人认为当对象参与到运算或强制使用Number(Person)时候就会转换为数值,例如(+Person、-Person、++Person、'' + Person、Person/5 、Person*3、Person%4 等情况);当对象不参与运算或者强制使用String(Person)方法进行转换成字符串的时候就会转换成String;
2、当转换为Number的时候会先调用valueOf(),如果valueOf()方法不存在的话,会调用toString()方法;
不过当转换为String的时候,只会调用toString()方法,即使toString()方法不存在,也不会调用valueOf()
方法,它会调用父类的toString()方法。
四、数值转换,共有3个函数可以将其他类型转换为数值,Number(),parseInt(),parseFloat()
(1)Number()函数,(当然Number()函数的转换前面已经描述,这里是为了进行横向对比,所以再描述一遍)
1、如果Boolean值,true和false将分别被转换 为1和0
2、如果是数字值,只是简单的传入和返回
3、如果是null,返回0
4、如果是Undefined,返回NaN
5、如果是String,会将该String先调用trim()方法,如果为空字符串则返回0,如果为一个数值形式的字符串就返回该数值,否则返回NaN
6、如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值,如果没有valueOf()方法就调用对象的toString()方法然后按照前面的规则转换返回值
(2)parseInt()
Number()函数转基本上是给javaScript语言内部自动转换时用的,所以兼容性比较大并且转换规则也比较复杂。parseInt()函数主要是看参数是否符合数值模式,parseInt()函数基本上是提供给用户将String类型转换成整数值的函数,虽然参数可以传入各种类型,但是这些参数都需要通过String()函数转换成String,然后按照规则进行转换。
个人总结parseInt()函数的转换步骤为:
1、先将参数通过String()函数转换成字符串,
2、将该字符串调用trim()函数,从第一个字符开始扫描直到第一不是有效数字字符结束(0x作为十六进制的前缀标识,如果是开始的话也会作为有效字符),如果扫描结果不为空字符串话则将该字符串根据前缀判断需要转换成对应进制的整数,否则返回NaN
(3)parseFloat()
parseFloat()函数和parseInt()类似都提供给用户将参数转换会浮点值的函数,当使用parseFloat()函数时,参数都需要通过String()函数转换成String然后按照规则进行转换。
个人总结pareFloat()函数的转换步骤为:
1、先将参数通过String()函数转换为字符串;
2、将该字符串调用trim()函数,从第一个字符开始扫描,将第一个.也作为有效数字字符,直到第一个不是有效数字字符结束,如果扫描结果不为空字符串,则转换成浮点数值,否则返回NaN
注释:在执行parseFloat()函数的时候,如果参数转换扫描后得到的为,只有浮点数形式而没有浮点数实际意义的字符串,这时javaScript为了节省内存会不失时机的将浮点数转换成整数值,例如:parseFloat('223.0')
会返回223,parseFloat('223.') 也会返回223