浅析JavaScript中的隐式类型转换


Posted in Javascript onDecember 05, 2013

如果把通过函数或方法调用,明确的将某种类型转换成另一种类型称为显示转换 ,相反则称为隐式类型转换 。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())时会隐式的将其转换成数字。
Javascript 相关文章推荐
javascript 节点遍历函数
Mar 28 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
Sep 26 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
Feb 12 Javascript
jquery编写Tab选项卡滚动导航切换特效
Jul 17 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
May 03 Javascript
Bootstrap中的Panel和Table全面解析
Jun 13 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
Jan 05 Javascript
layui 优化button按钮和弹出框的方法
Aug 15 Javascript
详解VUE单页应用骨架屏方案
Jan 17 Javascript
p5.js码绘“跳动的小正方形”的实现代码
Oct 22 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
Oct 26 Javascript
Vue 实现拨打电话操作
Nov 16 Javascript
浅析JavaScript中两种类型的全局对象/函数
Dec 05 #Javascript
完美解决IE低版本不支持call与apply的问题
Dec 05 #Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 #Javascript
jQuery表格插件ParamQuery简单使用方法示例
Dec 05 #Javascript
各浏览器对document.getElementById等方法的实现差异解析
Dec 05 #Javascript
给事件响应函数传参数的四种方式小结
Dec 05 #Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 #Javascript
You might like
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
JavaScript运算符小结
2015/06/03 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
继续学习javascript闭包
2015/12/03 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
node 解析图片二维码的内容代码实例
2019/09/11 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
python学习必备知识汇总
2017/09/08 Python
Python生成数字图片代码分享
2017/10/31 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
python爬虫添加请求头代码实例
2019/12/28 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
如何用python免费看美剧
2020/08/11 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
Python项目打包成二进制的方法
2020/12/30 Python
毕业生精彩的自我评价分享
2013/10/06 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
入党现实表现材料
2014/12/23 职场文书
美术教师个人总结
2015/02/06 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
民事答辩状格式范文
2015/05/21 职场文书
Spring实现内置监听器
2021/07/09 Java/Android