JavaScript中的值类型转换介绍


Posted in Javascript onDecember 31, 2014

在JavaScript中进行+、-、*、/、==、!=等运算时,如果操作符左右两边的值类型与预期类型不一致,JavaScript会将操作符两边的值转换成预期的类型后再进行操作。预期值类型为string时,JavaScript会将值转换为string;预期值类型为number时,JavaScript会将值转换为number (如果无法转换为数值,则返回NaN)比如:

 

console.log(10 + " cats");//10 cats

console.log(10 * " cats");//NaN, " cats" will be converted to NaN

console.log(10 + "2");//102

console.log(10 - "2");//8

console.log(10 / "2");//5

console.log(10 * "2");//20

console.log(10 * " 2");//20

console.log("10" * "2");//20

值类型转换规则

JavaScript中的值转换规则可以参考“JavaScript ? The Definitive Guide”一书中的Table 3-2. JavaScript type conversions。比较值得注意的一些地方是:

1.undefined转换成number后结果为NaN。
2.null转换成number后结果为0。
3.空字符串”"转换成number后结果为0。
4.-0转换成string后结果为”0″。
5.空数组[]转换成number后结果为0。
6.仅有一个number成员的数组(如[9])转换成number后结果为该numer值(9)。

当JavaScript将string转换成number时,有两个比较有趣的规则:

1.JavaScript会将字符串开头和结尾处的空白字符删除后再进行转换,因此像” 42 “这样的字符串可以顺利的被转换成数字42。

2.删除开头和结尾处的空白字符后,如果字符串中依然包含非数字字符,那么该字符串会被转换成NaN。比如:”3 m”就会被转换成NaN。

实例:

console.log(10 * " 3 ");//30

console.log(10 * "3 m");//NaN, "3 m" will be converted to NaN

值类型转换与比较

在JavaScript中,等于操作符(==)的使用会涉及到值类型转换:如果==操作符两边的值类型不一致,那么JS会将它们转换成一致的类型后再加以判断。需要小心的是,两个不同类型的值,经过类型转换后也许可以等价,但这并不意味着对它们使用==操作符的结果就一定为true。一个简单的例子是undefined和false:将undefined转换成boolean类型后结果刚好为false,但事实上undefined==false的结果却为false。

显式类型转换

使用JavaScript的类型自动转换非常便捷,但同时也很容易带来诸如代码可维护性等问题。为了使程序代码更加清晰、减少歧义,有时会在JS程序中使用显式类型转换:

Number("3")//3

String(false)//"false"

Boolean([])//true

大多数情况下,显式类型转换的结果与JS自动类型转换的结果是一致的;但存在1个特例:当将null或者undefined自动转换成Object时,JS将抛出TypeError错误;但当显式地将null或者undefined转换成Object时,JS将返回一个空的对象:
console.log(Object(undefined));//empty object

console.log(Object(null));//empty object

同时,如果显式转换所指定的类型与JS自动转换所指定的类型不一样,那么,得到的结果也不一样。比如之前所提及的undefined==false结果为false;如果显式指定转换类型为Boolean,那么得到的结果就为true了:
console.log(undefined == false);//false

console.log(Boolean(undefined) == Boolean(false));//true

对类型自动转换的使用

在JS中,可以使用值类型的自动转换,通过操作符来达到和显式转换一样的效果,比如:

console.log(false + "");//"false"

console.log(+false);//0

console.log(!!3);//true
Javascript 相关文章推荐
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
Apr 27 Javascript
jquery入门—访问DOM对象方法
Jan 07 Javascript
关于Jquery操作Cookie取值错误的解决方法
Aug 26 Javascript
JS在可编辑的div中的光标位置插入内容的方法
Nov 20 Javascript
JS网页在线获取鼠标坐标值的方法
Feb 28 Javascript
JS实现动态移动层及拖动浮层关闭的方法
Apr 30 Javascript
D3.js实现散点图和气泡图的方法详解
Sep 21 Javascript
vue.js实现仿原生ios时间选择组件实例代码
Dec 21 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
May 31 Javascript
vue中子组件的methods中获取到props中的值方法
Aug 27 Javascript
详解vue中使用protobuf踩坑记
May 07 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
Mar 01 Vue.js
javascript实现滑动解锁功能
Dec 31 #Javascript
JavaScript中number转换成string介绍
Dec 31 #Javascript
JavaScript中string转换成number介绍
Dec 31 #Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
Dec 31 #Javascript
JavaScript中的object转换成number或string规则介绍
Dec 31 #Javascript
javascript 事件处理示例分享
Dec 31 #Javascript
JavaScript中的变量作用域介绍
Dec 31 #Javascript
You might like
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
php实例化一个类的具体方法
2019/09/19 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
2018/07/02 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
Python类属性的延迟计算
2016/10/22 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
pandas删除指定行详解
2019/04/04 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
python 变量初始化空列表的例子
2019/11/28 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
如何进行Linux分区优化
2016/09/13 面试题
通信生自我鉴定
2014/01/18 职场文书
学校联谊活动方案
2014/02/15 职场文书
省文明单位申报材料
2014/05/08 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
车间主任岗位职责
2015/02/03 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
SpringBoot Http远程调用的方法
2022/08/14 Java/Android