博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析JavaScript中的隐式类型转换
阅读量:5879 次
发布时间:2019-06-19

本文共 1736 字,大约阅读时间需要 5 分钟。

hot3.png

如果把通过函数或方法调用,明确的将某种类型转换成另一种类型称为显示转换 ,相反则称为隐式类型转换 。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())时会隐式的将其转换成数字。

转载于:https://my.oschina.net/u/2294923/blog/679375

你可能感兴趣的文章
scala111
查看>>
模块化服务规范——OSGI
查看>>
劣质代码评析——猜数字问题(上)
查看>>
纸上谈兵: 栈 (stack)
查看>>
Windows phone8 基础篇(三) 常用控件开发
查看>>
Oracle学习笔记之五,Oracle 11g的PL/SQL入门
查看>>
大叔手记(3):Windows Silverlight/Phone7/Mango开发学习系列教程
查看>>
考拉消息中心消息盒子处理重构(策略模式)
查看>>
so easy 前端实现多语言
查看>>
【追光者系列】HikariCP源码分析之ConcurrentBag&J.U.C SynchronousQueue、CopyOnWriteArrayList...
查看>>
在navicat中如何新建连接数据库
查看>>
canvas系列教程05-柱状图项目3
查看>>
css绘制几何图形
查看>>
HTML标签
查看>>
理解JS中的Event Loop机制
查看>>
转载:字符编码笔记:ASCII,Unicode和UTF 8
查看>>
修复看不懂的 Console Log
查看>>
Android跨进程通信 AIDL使用
查看>>
ajax常见面试题
查看>>
结合kmp算法的匹配动画浅析其基本思想
查看>>