Home  >  Article  >  Web Front-end  >  浅析JavaScript中的隐式类型转换_javascript技巧

浅析JavaScript中的隐式类型转换_javascript技巧

WBOY
WBOYOriginal
2016-05-16 17:10:44958browse

如果把通过函数或方法调用,明确的将某种类型转换成另一种类型称为显示转换 ,相反则称为隐式类型转换 。google和维基百科中没有找到“显示类型转换”,“隐式类型转换”的字眼。暂且这么称呼。

一、 运算中存在的隐式类型转换

1, “+”运算符

复制代码 代码如下:

var a = 11, b = '22';
var c = a + b;

这里引擎将会先把a变成字符串"11"再与b进行连接,变成了"1122"。有人会有疑问,为什么不把b变成数字22再进行算术加运算呢,这样的话c就是33了。没有为什么,当运算符“+”两边一个是数字类型,一个是字符串类型时,js引擎规定进行字符串连接运算而非算术加运算。利用运算符“+”这个特性,可以很方便的将Number转换成String。如
复制代码 代码如下:

var a = 11;
alert(typeof a); //-->number
a = a + '';
alert(typeof a); //-->string

2,“-”运算符

“-”可以是一元运算符(取负),也可以是二元(减法运算)的。如

复制代码 代码如下:

var a = 11, b = '5';
var c = a - b;
alert(typeof c); //--> number

这里与上面的“+”相反,会把字符串b隐式的转换成数字5再进行算术减法运算。利用这个特性,可以很方便的将String转换成Number
复制代码 代码如下:

var a = '11';
a = a - '';
alert(typeof a);// -->number

二、 语句中存在的隐式类型转换

1,if

复制代码 代码如下:

var obj = {name:'jack'}
if(obj){
    //do more
}

这里会把obj隐式的转换成Boolean类型

2,while

复制代码 代码如下:

var obj = {name:'jack'}
while(obj){
    //do more
}

同if

3,for in时的类型转换
定义对象字面量时发生从标识符到字符串的隐式转换。

复制代码 代码如下:

var person = {'name':'jack',"age":20,school:'PKU'};
for(var a in person){
    alert(a + ": " + typeof a);
}

这里name,age分别加单/双引号以强调其为String类型,school没有加单/双引号。我们遍历下该对象的属性,查看其类型。发现school也被隐式的转换成了String类型。

数组的索引其实也是字符串类型。这着实令人惊叹,但事实的确如此。如

复制代码 代码如下:

var ary = [1,3,5,7];
for(var a in ary){
    alert(a + ": " + typeof a);
}

三、 alert时存在的隐式类型转换
复制代码 代码如下:

String.prototype.fn = function(){return this};
var a = 'hello';
alert(typeof a.fn()); //-->object
alert(a.fn()); //-->hello

给String原型上添加了个fn方法,该方法返回this,我们知道this可以理解成当前类的实例对象,既然是对象那么typeof a.fn()自然返回是object了。
关键是最后的alert(a.fn()),a.fn()返回的明明是对象,但却隐式的转换成了字符串“hello”显示。

同样的情况发生在数字类型上,如

复制代码 代码如下:

Number.prototype.fn = function(){return this};
var a = 10;
alert(typeof a.fn());//-->object
alert(a.fn()); //-->10

a.fn()返回的是对象类型,但在alert(a.fn())时会隐式的将其转换成数字。
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn