阿里二面题,以前学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)