javascript 中的怪癖,js运算符隐式类型转换
x + "" //等价于 String(x)
+ x //等价于 Number(x),也可以写成x-0
!!x //等价于 Boolean(x),注意是双叹号!
var now = new Date(); //创建一个日期对象
typeof(now + 1) //=> "string":"+"将日期转换为字符串
typeof(now - 1) //=> "number":"-"使用对象到数字的转换
now == now.toString() //=> true:隐式(==)的和显式(toString)的字符串转换
now > (now - 1) //=> true: ">"将日期转换为数字
一、 运算中存在的隐式类型转换
1、 “+”运算符
1
2
3
|
<span style= "font-size: 14px;" > var
a = 11, b = ‘22‘ ;
var
c = a + b;
</span> |
这里引擎将会先把a变成字符串"11"再与b进行连接,变成了"1122"。有人会有疑问,为什么不把b变成数字22再进行算术加运算呢,这样的话c就是33了。没有为什么,当运算符“+”两边一个是数字类型,一个是字符串类型时,js引擎规定进行字符串连接运算而非算术加运算。利用运算符“+”这个特性,可以很方便的将Number转换成String。如
1
2
3
4
5
|
<span style= "font-size: 14px;" > var
a = 11;
alert( typeof
a); //-->number
a = a + ‘‘ ;
alert( typeof
a); //-->string
</span> |
2、“-”运算符
“-”可以是一元运算符(取负),也可以是二元(减法运算)的。如
1
2
3
4
|
<span style= "font-size: 14px;" > var
a = 11, b = ‘5‘ ;
var
c = a - b;
alert( typeof
c); //--> number
</span> |
这里与上面的“+”相反,会把字符串b隐式的转换成数字5再进行算术减法运算。利用这个特性,可以很方便的将String转换成Number
1
2
3
4
|
<span style= "font-size: 14px;" > var
a = ‘11‘ ;
a = a - ‘‘ ;
alert( typeof
a); // -->number
</span> |
二、 语句中存在的隐式类型转换
1、if
1
2
3
4
5
|
<span style= "font-size: 14px;" > var
obj = {name: ‘jack‘ }
if (obj){
//do more
} </span> |
这里会把obj隐式的转换成Boolean类型
2、while
1
2
3
4
5
|
<span style= "font-size: 14px;" > var
obj = {name: ‘jack‘ }
while (obj){
//do more
} </span> |
同if
3、for in时的类型转换
定义对象字面量时发生从标识符到字符串的隐式转换。
1
2
3
4
5
|
<span style= "font-size: 14px;" > var
person = { ‘name‘ : ‘jack‘ , "age" :20,school: ‘PKU‘ };
for ( var
a in
person){
alert(a + ": "
+ typeof
a);
} </span> |
这里name,age分别加单/双引号以强调其为String类型,school没有加单/双引号。我们遍历下该对象的属性,查看其类型。发现school也被隐式的转换成了String类型。
数组的索引其实也是字符串类型。这着实令人惊叹,但事实的确如此。如
1
2
3
4
5
|
<span style= "font-size: 14px;" > var
ary = [1,3,5,7];
for ( var
a in
ary){
alert(a + ": "
+ typeof
a);
} </span> |
三、 alert时存在的隐式类型转换
1
2
3
4
5
|
<span style= "font-size: 14px;" >String.prototype.fn = function (){ return
this };
var
a = ‘hello‘ ;
alert( typeof
a.fn()); //-->object
alert(a.fn()); //-->hello
</span> |
给String原型上添加了个fn方法,该方法返回this,我们知道this可以理解成当前类的实例对象,既然是对象那么typeof
a.fn()自然返回是object了。
关键是最后的alert(a.fn()),a.fn()返回的明明是对象,但却隐式的转换成了字符串“hello”显示。
同样的情况发生在数字类型上,如
1
2
3
4
5
|
<span style= "font-size: 14px;" >Number.prototype.fn = function (){ return
this };
var
a = 10;
alert( typeof
a.fn()); //-->object
alert(a.fn()); //-->10
</span> |
a.fn()返回的是对象类型,但在alert(a.fn())时会隐式的将其转换成数字。