JavaScript数据类型大体分为两类:primitive和object,primitive包括:string,boolean,number,undefined,null;object包括:object,array,function。
JavaScript在期待某种类型的地方,而该地方的数据类型是其他的类型的时候,JavaScript会自动地进行类型的转换,比如在if条件判断中,条件表达式需要一个boolean类型,但是条件表达式的结果为undefined,数字等等的时候,JavaScript会把这些数据转换成boolean,然后判断。如:
var x=5;
if(x){//x是个数字,值等于5,但是if需要的是boolean,所以把5转成boolean,为true,条件里的代码得以执行。
}
下面讲解下,不同数据类型之间的转换规则:
一、primitive到primitive转换
1、string转换到boolean:空字符串转换后为false,其他所有的字符串转换后都为true
2、string转换到number:可以解析成一个数值的字符串可以转换成对应的数值,并且忽略首尾的空格。如果首尾是非空格字符,转换成数字后为NaN。
3、boolean转换为string:true:"true",false:"false"
4、boolean转换为number:true:1,false:0
5、number转换为string:0:"0",-0:"0",Infinity:"Infinity",-Infinity:"-Infinity",NaN:"NaN",12:"12"
6、number转换为boolean:0,-0,NaN:false,其他所有的number都为true
7、undefined转换为string:"undefined"
8、undefined转换为boolean:false;
9、undefined转换为number:NaN
10、null转换为string:"null"
11、null转换为boolean:false
12、null转换为number:0
二、primitive到Object转换:
1、string,boolean,number转成Object,是相应的转换成其对应的包装类型:String,Boolean,Number
2、null,undefined不能转换成Object,强转的话,报TypeError错误。
三、Object到primitive转换:
1、Object到boolean的转换:所有的Object转换后都为true,包括array,function。也包括Boolean(false)。
Object到number和string的转换,是通过调用他们对应的对象上的方法来实现的。JavaScript的对象上有两个方法来执行转换,一个是toString(),一个是valueOf().所有的对象都继承了这两个方法。
toString()方法是返回对象的字符串表示形式,该方法默认返回的是一个没有特别意义的字符串,但是Array,Date,RegExp,Function对该方法进行了特别的定义,返回的字符串有相应的意义。
valueOf()方法执行的任务没有很好地定义,如果对象存在对应的原始类型,它应该是返回该对象对应的原始数据类型,但是对象是复合类型,一般不存在一个单一的原始类型与之对应。所以默认该方法返回的是这个对象本身,而不是一个原始类型。但是包装类(Number,Boolean,String)的这个方法返回的是其包装的原始类型,Array,Function,RegExp继承默认的方法。Date的这个方法返回的是该时间距离1970.1.1所经历的时间间隔,以毫秒为单位。
解释了toString和valueOf方法,继续看看Object到number和string的转换。
2、Object到string的转换步骤:
a.如果对象存在toString方法,调用它,如果返回的是原始类型的值,JS把原始类型的值转成string(如果原始类型不是string类型才转),然后返回该值。
b.不存在toString方法或者返回值不是原始类型的话,检查是否存在valueOf方法,如果存在,调用它,如果返回的是原始类型的值,JS把原始类型的值转成string(如果原始类型不是string类型才转),然后返回该值。
c.通过这两个方法都无法获取一个原始类型值,抛出TypeError异常。
3、Object到number的转换步骤:(和string类似,只是先检查的是valueOf方法,然后是toString)
a.如果对象存在valueOf方法,调用它,如果返回的是原始类型的值,JS把原始类型的值转成number(如果原始类型不是number类型才转),然后返回该值。
b.检查是否存在toString方法,如果存在,调用它,如果返回的是原始类型的值,JS把原始类型的值转成number,然后返回该值。
c.通过这两个方法都无法获取一个原始类型值,抛出TypeError异常。
四、显示转换
前面三种都是隐式的自动转换,JavaScript也可以显示地进行类型转换,这是通过包装类进行的,比如:
Number("67");//字符转数值:67
String(false);//"false"
Boolean([]);//数组转boolean,值为true
Object(3);//new Number(3)
上面讲了不同类型之间的自动转换规则,那么在哪些条件下会引起或者说触发相应的转换呢?下面列出一些场景:
1、if,while等条件语句中,前面有例子。
2、不同数据类型进行运算的时候,比如:
"23"+5//二元运算符+(加)把数值5转成字符串,所以结果为"235"
+"23”+5//第一个一元运算符+(取正,注意和上例的区别) 把"23"字符串转成数值23,所以结果为28
"23"-true//二元运算符-(减)把其他类型转成数值型,所以结果为22
3、比较运算符的两边,数据类型不同时,可能会转换。
比如这四个表达式都为true:undefined==null,"0"==0,"0"==false,0==false
这是因为在进行比较前的时候,等号两边不同的数据类型会进行类型转换,转成相同类型(最终是何种类型,下面有规则说明)再比较(undefine和null例外,他们不转换,默认认为他们相等)。
但是需要注意的是,就算等号两边的类型可以转换,转换后的值也相等,并不意味着他们就真的相等。比如:undefined==false返回的是false,说明他们并不相等。
这是因为==两边的类型在转换的时候,永远不会被转换成boolean类型。那么到底转换的时候,遵循什么规则呢?