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的设置页面文本框 只能输入数字的实现代码
Apr 19 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
Oct 29 Javascript
js实现在同一窗口浏览图片
Sep 17 Javascript
JavaScript中的类(Class)详细介绍
Dec 30 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
Jun 20 Javascript
详解jQuery事件
Jan 13 Javascript
bootstrap实现的自适应页面简单应用示例
Mar 09 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
Jun 29 Javascript
Vue的土著指令和自定义指令实例详解
Feb 04 Javascript
vue-cli构建项目下使用微信分享功能
May 28 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
通过实例解析jQ Ajax操作相关原理
Sep 23 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
基于mysql的bbs设计(四)
2006/10/09 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
javascript表格隔行变色加鼠标移入移出及点击效果的方法
2015/04/10 Javascript
深入探寻seajs的模块化与加载方式
2015/04/14 Javascript
jquery插件格式实例分析
2016/06/16 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
详解Python中的正则表达式的用法
2015/04/09 Python
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
美国内衣品牌:Leonisa
2016/08/14 全球购物
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
视图的作用
2014/12/19 面试题
函授本科毕业自我鉴定
2013/10/09 职场文书
生产总经理岗位职责
2013/12/19 职场文书
写自荐信三大法宝
2014/01/24 职场文书
渡河少年教学反思
2014/02/12 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
争先创优心得体会
2014/09/12 职场文书
2015年营业员工作总结
2015/04/23 职场文书
运动会主持词大全
2015/07/02 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
SpringBoot集成Redis的思路详解
2021/10/16 Redis