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 相关文章推荐
Javascript SHA-1:Secure Hash Algorithm
Dec 20 Javascript
a标签的href和onclick 的事件的区别介绍
Jul 26 Javascript
自己使用js/jquery写的一个定制对话框控件
May 02 Javascript
node.js中的fs.utimes方法使用说明
Dec 15 Javascript
jQuery多条件筛选如何实现
Nov 04 Javascript
js捕捉键盘事件和按键键值的方法
Oct 10 Javascript
JS区分Object与Aarry的六种方法总结
Feb 27 Javascript
JavaScript编写棋盘覆盖代码详解
Aug 28 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
Dec 16 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
Feb 14 Javascript
vue键盘事件点击事件加native操作
Jul 27 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加密解密函数authcode的用法详细解析
2013/10/28 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
2018/03/31 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
python实现八大排序算法(2)
2017/09/14 Python
python实现QQ批量登录功能
2019/06/19 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
中海讯通笔试题
2015/09/15 面试题
高二历史教学反思
2014/01/25 职场文书
运动会入场词60字
2014/02/15 职场文书
《春晓》教学反思
2014/04/20 职场文书
心理健康活动总结
2014/04/30 职场文书
自我推荐信范文
2014/05/09 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
如何通过一篇文章了解Python中的生成器
2022/04/02 Python