JavaScript中的object转换成number或string规则介绍


Posted in Javascript onDecember 31, 2014

在JavaScript程序编写过程中,根据不同的上下文,JS会自动将object转换成number或者string后再处理。这种自动转换的规则如下:

object自动转换成string的规则:

1.如果object所属类覆写了toString()方法,则调用该方法。如果toString()调用的返回结果为Primitive(string、number、boolean、undefined、null),则将该Primitive值转换成string后返回。

2.如果object所属类没有覆写toString()方法 ? toString()调用的返回结果为”[object Object]“;或者覆写了toString()方法但该方法返回结果为对象。那么JS将调用object的valueOf()方法,如果valueOf()调用的返回结果为Primitive(string、number、boolean、undefined、null),则将该Primitive值转换成string后返回。

3.如果上述两点均无法满足,无法通过调用object的toString()方法或者valueOf()方法来获取Primitive值,那么JS将抛出TypeError错误。

object自动转换成number的规则:

1.调用object的valueOf()方法,如果得到的是Primitive值,则将该Primitive值转换成number后返回。

2.如果无法从valueOf()方法中获取Primitive值,那么调用object的toString()方法;如果toString()返回的是Primitive值,则将该Primitive值转换成number后返回。

3.如果上述两点均无法满足,那么JS将抛出TypeError错误。

可以看到,object自动转换成string和object自动转换成number的规则其实是一致的,不同之处在于toString()方法和valueOf()方法的调用次序。

根据上述规则,可以很好的理解一些转换结果:

1.对于空数组,当将其转换成number时,得到的结果为0。这是因为首先会调用array的valueOf()方法,由于valueOf()返回的是数组对象本身,因此接下来JS会调用空数组的toString()方法;因为空数组toString()后返回结果为空字符串,因此最终会将空字符串转换成数字0后返回。

2.对于只有一个数字成员的数组来说,应用同样的规则转换成number,最后得到的结果就是该数字。

3.对于有多个数字成员的数组来说,由于无法将字符串转换成number,因此最后得到的结果为NaN。

何时转换成string?何时转换成number?

对object进行自动类型转换时,根据object类型的不同以及操作符的不同,JS会选择将其转换成string还是number。具体规则如下:

1.+操作符两边出现对象的,将对象转换成string。
2.所有对象(Date对象除外),优先转换成number。
3.对于Date对象,优先转换成string。

值得注意的是,对于+操作符,除了操作符两边出现对象或者字符串的情况,其余情况下均执行“转换成number”的操作,同时,这种操作还与值之间的顺序有关。

实验

console.log(3 * []);//0

console.log(3 * [2]);//6

console.log(3 * [1,2]);//NaN
console.log(3 + [2]);//32
var now = new Date();

console.log(now + 1);//Wed Mar 26 2014 10:51:39 GMT+0800 (CST)1

console.log(now - 1);//1395802299223

console.log(now * 2);//2791604598448
console.log(true + true);//2

console.log(2 + null);//2, null is converted to 0

console.log(2 + undefined);//NaN, undefined is converted to NaN

console.log(1 + 2 + " cats");//3 cats

console.log(1 + (2 + " cats"));//12 cats
Javascript 相关文章推荐
jquery $.ajax入门应用一
Nov 19 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
Sep 28 Javascript
使用GruntJS构建Web程序之构建篇
Jun 04 Javascript
JS自定义对象实现Java中Map对象功能的方法
Jan 20 Javascript
javascript的BOM汇总
Jul 16 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
Feb 14 Javascript
基于d3.js实现实时刷新的折线图
Aug 03 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 Javascript
原生JS实现的双色球功能示例
Feb 02 Javascript
vue中vee validate表单校验的几种基本使用
Jun 25 Javascript
Vue加载json文件的方法简单示例
Jan 28 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
Aug 07 Javascript
javascript 事件处理示例分享
Dec 31 #Javascript
JavaScript中的变量作用域介绍
Dec 31 #Javascript
JavaScript中的变量定义与储存介绍
Dec 31 #Javascript
JavaScript中的操作符==与===介绍
Dec 31 #Javascript
jQuery中[attribute]选择器用法实例
Dec 31 #Javascript
JavaScript中的比较操作符>、=、
Dec 31 #Javascript
javascript 操作符(~、&、|、^、)使用案例
Dec 31 #Javascript
You might like
第十节--抽象方法和抽象类
2006/11/16 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
js传值 判断
2006/10/26 Javascript
Javascript与flash交互通信基础教程
2008/08/07 Javascript
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
JS实现文字放大效果的方法
2015/03/03 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
js初始化验证实例详解
2016/11/26 Javascript
js常用DOM方法详解
2017/02/04 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
vue中tab选项卡的实现思路
2018/11/25 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
urllib2自定义opener详解
2014/02/07 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
python数据类型强制转换实例详解
2020/06/22 Python
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
控制工程专业个人求职信
2013/09/25 职场文书
行政总经理岗位职责
2013/12/05 职场文书
土木工程专业个人求职信
2013/12/30 职场文书
大学生就业自荐书
2014/06/16 职场文书
会计工作态度自我评价
2015/03/06 职场文书