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 相关文章推荐
Locate a File Using a File Open Dialog Box
Jun 18 Javascript
javaScript parseInt字符转化为数字函数使用小结
Nov 05 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
Apr 02 Javascript
jQuery插件MixItUp实现动画过滤和排序
Apr 12 Javascript
jquery UI Datepicker时间控件冲突问题解决
Dec 16 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
Mar 13 Javascript
vue如何安装使用Quill富文本编辑器
Sep 21 Javascript
react native 仿微信聊天室实例代码
Sep 17 Javascript
浅谈小程序globalData的那些事儿
Nov 01 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
Nov 24 Javascript
js实现上传图片并显示图片名称
Dec 18 Javascript
JavaScript中reduce()的用法
May 11 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
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
php程序内部post数据的方法
2015/03/31 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
fetch 如何实现请求数据
2018/12/20 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
详解Python读取yaml文件多层菜单
2019/03/23 Python
Django app配置多个数据库代码实例
2019/12/17 Python
使用python实现多维数据降维操作
2020/02/24 Python
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
公司会议策划方案
2014/05/17 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
法人代表证明书
2014/09/18 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
企业团队精神心得体会
2016/01/19 职场文书
《失物招领》教学反思
2016/02/20 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
Python类方法总结讲解
2021/07/26 Python