浅析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 相关文章推荐
读jQuery之十一 添加事件核心方法
Jul 31 Javascript
Lab.js初次使用笔记
Feb 28 Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 Javascript
比较常见的javascript中定义函数的区别
Nov 09 Javascript
深入理解ECMAScript的几个关键语句
Jun 01 Javascript
逻辑表达式中与或非的用法详解
Jun 06 Javascript
javascript作用域、作用域链(菜鸟必看)
Jun 16 Javascript
vue插件tab选项卡使用小结
Oct 27 Javascript
vue学习笔记之指令v-text && v-html && v-bind详解
May 12 Javascript
JS将网址url转化为JSON格式的方法
Jul 02 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
Jul 25 Javascript
jquery实现拖拽添加元素功能
Dec 01 jQuery
浅析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
php实现源代码加密的方法
2015/07/11 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
google地图的路线实现代码
2009/08/20 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
go语言计算两个时间的时间差方法
2015/03/13 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
pandas取出重复数据的方法
2019/07/04 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
sklearn的predict_proba使用说明
2020/06/28 Python
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
三年级语文教学反思
2014/02/01 职场文书
希特勒的演讲稿
2014/05/23 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
离婚协议书范文2014
2014/10/16 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
员工年度工作总结2015
2015/05/18 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA
尝试使用Python爬取城市租房信息
2022/04/12 Python