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 相关文章推荐
一端时间轮换的广告
Jun 26 Javascript
Ext javascript建立超链接,进行事件处理的实现方法
Mar 22 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
Jul 26 Javascript
jquery实现通用版鼠标经过淡入淡出效果
Jun 15 Javascript
JavaScript 学习笔记之基础中的基础
Jan 13 Javascript
JavaScript中常见的字符串操作函数及用法汇总
May 04 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
Feb 18 Javascript
微信小程序 教程之wxapp视图容器 swiper
Oct 19 Javascript
jQuery插件artDialog.js使用与关闭方法示例
Oct 09 jQuery
JavaScript选择排序算法原理与实现方法示例
Aug 06 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
Mar 03 Javascript
js实现微信聊天效果
Aug 09 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
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
python实现文件分组复制到不同目录的例子
2014/06/04 Python
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
对numpy中shape的深入理解
2018/06/15 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
python判断完全平方数的方法
2018/11/13 Python
python3.6实现学生信息管理系统
2019/02/21 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
办公室文员自荐书
2014/02/03 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
社区维稳工作方案
2014/06/06 职场文书
个人总结与自我评价
2014/09/18 职场文书
诉讼和解协议书
2016/03/23 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
springboot中rabbitmq实现消息可靠性机制详解
2021/09/25 Java/Android