JavaScript的类型转换

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类型。那么到底转换的时候,遵循什么规则呢?

原文地址:https://www.cnblogs.com/winson/p/3337372.html