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 相关文章推荐
document.all与WEB标准
May 13 Javascript
用jquery与css打造个性化的单选框和复选框
Oct 20 Javascript
firefox下input type="file"的size是多大
Oct 24 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
Aug 12 Javascript
jQuery插件开发的两种方法及$.fn.extend的详解
Jan 16 Javascript
js动态控制table的tr、td增加及删除的具体实现
Apr 30 Javascript
基于jQuery实现选取月份插件附源码下载
Dec 28 Javascript
微信js-sdk上传与下载图片接口用法示例
Oct 12 Javascript
快速解决vue-cli在ie9+中无效的问题
Sep 04 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
Oct 12 Javascript
vue 使用localstorage实现面包屑的操作
Nov 16 Javascript
Vue3如何理解ref toRef和toRefs的区别
Feb 18 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命名空间(Namespace)的使用详解
2013/05/04 PHP
preg_match_all使用心得分享
2014/01/31 PHP
php构造函数的继承方法
2015/02/09 PHP
PHP pear安装配置教程
2016/05/14 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
IE8下String的Trim()方法失效的解决方法
2013/11/08 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
js+html制作简单验证码
2017/02/16 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
angular动态表单制作
2018/02/23 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
2019/02/18 jQuery
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
自定义django admin model表单提交的例子
2019/08/23 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
毕业生大学生活自我总结
2014/01/31 职场文书
书法比赛获奖感言
2014/02/10 职场文书
低碳生活倡议书
2014/04/14 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
雨花台导游词
2015/02/06 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL