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 相关文章推荐
漂亮的仿flash菜单,来自蓝色经典
Jun 26 Javascript
jquery 提交值不为空的元素示例代码
May 10 Javascript
JS获取html对象的几种方式介绍
Dec 05 Javascript
jsPDF导出pdf示例
May 02 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
Aug 24 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
Dec 19 Javascript
无循环 JavaScript(map、reduce、filter和find)
Apr 08 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
Aug 04 jQuery
vue-router history模式下的微信分享小结
Jul 05 Javascript
Element Notification通知的实现示例
Jul 27 Javascript
vue style width a href动态拼接问题的解决
Aug 07 Javascript
Angular性能优化之第三方组件和懒加载技术
May 10 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
php5.2.0内存管理改进
2007/01/22 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
探究python中open函数的使用
2016/03/01 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
详解Python核心对象类型字符串
2018/02/11 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
银行个人求职自荐信范文
2013/12/16 职场文书
学生安全责任书
2014/04/15 职场文书
如何写股份合作协议书
2014/09/11 职场文书
如何做好工作总结!
2019/04/10 职场文书
java泛型通配符详解
2021/07/25 Java/Android
python playwright 自动等待和断言详解
2021/11/27 Python