强制类型转换

阿里二面题,以前学c那些强类型语言,没有注意,js的类型转换与那些强类型语言不同。

首先,明确基本类型之间转换规则。基本类型(primitive type)分为:number,string,boolean,undefined,null,还有symbol。

ToString,ToNumber,ToBoolean以及ToPrimitive

1.ToString非字符串转化为字符串

null->'null'

undefined->"undifined"

普通对象:有toString方法调用toString,否则返回内部[[class]]。"[object Object]"。

数组:所有单元变用,连接的字符串

json:调用JSON.stringify(),JSON.stringify()在对象中遇到undefined、function、symbol自动忽略,在数组中则返回null。

  JSON.stringify(undefined);//undefined

      JSON.stringify([1,undefined,function(){}]);//[1,null,null]

2.ToNumber

true->1,false->0,undefined->NaN,null->0。

ToNumber对0开头的十六进制数以十进制处理。

将对象转为基本类型:先检查是否有valueOf()方法,若无,则使用toString()方法。两种方法都不返回基本类型值,就产生TypeError错误

Number(["abc"])//NaN

3.ToBoolean

JS中不仅仅false表示假,undefined ,null,0,NaN,""都表示假。

所有对象都是真。

 

 

4.显式类型转换

(1)字符串和数字

除了Number()和String()外,还有其他方法可以实现字符串和数字的显示类型转换。

var a=42;

a.toString();//"42"

var c="3.14";

+c;//3.14

+一元运算符,显式将操作数强制类型转换为数字

(2)解析数字字符串

var a="42px"

Number(a)//NaN

parseInt(a)//42

parseInt()解析字符串为数字,允许有非数字,遇到非数字停止.若参数非字符串,转换为字符串解析,因此要避免参数为非字符串。

Number()转换,有非数字,返回NaN

(3)转换为布尔值

一元运算符!显式强制转换为布尔值,一般用!!来表示原值的布尔值

三目运算符?:也是强制类型转换

5.隐式类型转换

(1).字符串和数字间隐式类型转换

只要有一个操作数是字符串,+执行的就是字符串拼接。

[]+{}//"[object Object]"

{}+[]//0

[]->"",{}->[object Object]

{}代码块,相当于+[]->0

-数字减法运算符,a-0将a强制转换为数字

(2)隐式类型转换为布尔值

·if

·for()

·while,do while

·?:

·|| &&左边操作数

其中,||操作数1为真返回操作数1,为假返回操作数2

&&操作数1为真返回操作数2,为假返回操作数1.

(3)符号强制类型转换

符号类型可以显示String()转换为字符串,不能隐式转换。

符号类型可以转换为布尔值

(4)相等操作符==

允许不同类型通过转换后比较

null==undefined//true

一般都转换成Number类型比较

最好不要用==true或者==false

用if(!!a)

NaN不等于NaN

+0等于-0

***对象和非对象的相等比较

x==ToPrimitive(y)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



posted @ 2017-05-28 21:25  我叫王自信  阅读(416)  评论(0编辑  收藏  举报