JS的数据类型转换
一、自动类型转换
一般是跟运行环境和操作符联系在一起的,是一种隐式转换,具有一定的规律性,大体可以划分为:转换为字符串类型、转换为布尔类型、转换为数字类型。
(1)转换为字符串类型
当加号“+”作为二元操作符,并且其中一个操作数为字符串类型时,另一个操作数将会被无条件转为字符串类型。
对于基础类型,会直接转换为与字面量相一致的字符串类型。
对于复合类型,会先试图调用对象的valueOf()方法(返回对象的指定原始值),如果此方法返回值是引用类型,则接着再调用它其toString()方法(返回对象的字符串表示),最后将返回值转为字符串类型。

(2)转换为布尔类型
数字转为布尔类型
当数字在逻辑环境中执行的时候,会自动转为布尔类型。
0和NaN会自动转为false,其余数字都被认为是true(非0负值也会被认为是true)。
字符串转为布尔类型
和数字类似,当字符串在逻辑环境中执行时,也会被转换为布尔类型。
空字符串会被转为false,其他字符串都会转为true。
undefined和null转为布尔类型
当undefined和null在逻辑环境中执行时,都被认为是false。
对象转为布尔类型
当对象在逻辑环境中执行时,只要当前引用的对象不为空,都会被认为是true。如果一个对象的引用为null,会被转换为false。虽然使用typeof检测null为“object”,但它并不是严格意义上的对象类型,只是一个对象空引用的标识。
另外,这里的逻辑环境不包括比较操作符(==),因为它会根据valueOf()和toString()将对象转为其他类型。
由于对象总被认为是true,使用基础类型的包装对象时,要特别小心。
对于Boolean类,有个特别需要注意的地方,当传入一个字符串时,它不会去解析字符串内部的值,而是做一个简单的判断,只要不是空字符串,都会被认为是true。
逻辑非、逻辑与和逻辑或操作符转布尔类型
连用两个逻辑非可以把一个值转为布尔类型。
(3)转换为数字类型
操作数在数字环境中参与运算时,会被转为相应的数字类型值,其转换规则如下:
字符串类型转为数字:空字符串被转为0,非空字符串中,符合数字规则的会被转换为相应的数字,否则视为NaN。
布尔类型转为数字:true被转为1,false被转为0。
null被转为0,undefined被转为NaN。
对象类型转为数字:valueOf()方法先试图被调用,如果调用返回的结果为基础类型,则再将其转为数字;如果返回的结果不是基础类型,则会再试图调用toString()方法,最后试图将返回结果转为数字,如果这个返回结果是基础类型,则会得到一个数字或NaN,如果不是基础类型,则会抛出一个异常。
一个其他类型的值被转换为数字,跟其参与运算的操作符有很密切的联系。
二、强制类型转换
(1)String
把一个数据类型强制转为String类型有两种方法:
方法一:toString()方法
Null和Undefined不能进行转换,因为它们没有toString()方法。
方法二、调用String()函数
(2)Number
转换情况:
1、数字->数字
2、非全数字->NaN
3、空串和满空格->0
4、布尔值转换:true->1,false->0
5、null->0
6、Undefined->NaN
方法一、Number()函数
方法二、ParseInt();ParseFloat()
这种方式一般用于字符串,其他类型会优先转换为字符串类型然后再操作。
ParseInt():从字符串中取整数,从左向右开始检查,遇见非数字的后面全不取。
parseInt(string, radix) 当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。
ParseFloat():从字符串中取出有效的小数,从左向右开始检查,遇见非数字的后面不取。
其他类型:
(3)Boolean
Boolean()函数:
转换为Boolean只有一个方法。
转换值:
数字:0和NaN为false,其他为true。
字符串:空串为false,其他为true。
null和undefined都是false。
Object(对象)转换也为true。