javascript中强制执行toString()具体实现


Posted in Javascript onApril 27, 2013

原文:Enforcing toString()
译文:javascript 中强制执行 toString()
译者:singleseeker
Javascript通常会根据方法或运算符的需要而自动把值转成所需的类型,这可能导致各种错误。 Brian McKenna (@puffnfresh) suggests 提供了下列测试代码:

Object.prototype.valueOf = function () { 
throw new Error('Use an explicit toString'); 
}; 
[\s\S ]*\n 
这些代码会产生什么效果? 你现在再也不能用加号运算符去把一个对像转成一个字符串了: 
[code] 
> var obj = {}; 
> 'Hello '+obj

Error: Use an explicit toString
> String(obj) 
'[object Object]' 
> obj.toString() 
'[object Object]' 
> 'Hello '+String(obj)

'Hello [object Object]'这个又是怎么回事呢? 要把一个对象转成一个特定的基本类型 T,首先是它的值被转化成基本类型,然后才是转换成 T,前一个转换由两步完成:
1.调用 valueOf() 方法,如果返回一个基本类型,那么就结束
2.不然,调用方法 toString()。如果返回一个基本类型,那么结束
3.再不然,抛出错误
如果最后的转换是个数值,会是上述调用 valueOf() 与 toString 的这个顺序。
如果最后的转换是字符串,那么 toString 会被先调用。 加号运算符可能会被值转成数值型或是字符串型,但它通常根据数字运算产生一个基本类型。
不用在文章开始发的代码片段, Object.prototype.valueOf() 会返回这个对象本身,这个是从原生对象继续来的没有被重写的方法:
> var obj = {}; 
> obj.valueOf() === obj

true加号运算符最终会调用 toString()。 上面的代码片段阻止了调用,在能调用那个方法前抛出了错误。
注意这个错误信息并不总是完全正确。
> Number(obj)

Error: Use an explicit toString但是这一招扔然是有用的。
如果一个对象真想被转化成数字,那么它无论如何还是要调用自己的 valueOf 方法。
@singleseeker罗嗦:这篇文章翻译起来真心是想更种吐槽,知识点总结的倒是不错, 不过做为一个不是英语为母语的老外写的英文技术文章交给我一个母语不是英语的菜鸟翻译,着实够折磨人。 下面进行简单的总结。
1.通常 valuOf() 指示返回一个未转换的对象,也就是其本身
2.加号运算符除了 Date 对象外,几乎全是先调用 valueof() 方法
3.如果使得 valueof() 返回一个明确的基本数值类型,那么当一个对象与字符串相加时,toString() 将不会被调用
参考
1.强制转换对象(objects)为原始值(primitives)
2.JavaScript中,{}+{}等于多少?
Javascript 相关文章推荐
javascript提取URL的搜索字符串中的参数(自定义函数实现)
Jan 22 Javascript
JS的Document属性和方法小结
Sep 17 Javascript
点击弹出层效果&弹出窗口后网页背景变暗效果的实现代码
Feb 10 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
Jun 13 Javascript
javascript Deferred和递归次数限制实例
Oct 21 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
Dec 28 Javascript
深入理解vue中的$set
Jun 01 Javascript
Angularjs上传文件组件flowjs功能
Aug 07 Javascript
JavaScript惰性求值的一种实现方法示例
Jan 11 Javascript
mocha的时序规则讲解
Feb 16 Javascript
转换layUI的数据表格中的日期格式方法
Sep 19 Javascript
react antd实现动态增减表单
Jun 03 Javascript
用客户端js实现带省略号的分页
Apr 27 #Javascript
jquery ajax同步异步的执行最终解决方案
Apr 26 #Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
Apr 26 #Javascript
JQuery的Ajax跨域请求原理概述及实例
Apr 26 #Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 #Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
Apr 26 #Javascript
基于jquery中children()与find()的区别介绍
Apr 26 #Javascript
You might like
最省空间的计数器
2006/10/09 PHP
linux php mysql数据库备份实现代码
2009/03/10 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
thinkPHP基于ajax实现的菜单与分页示例
2016/07/12 PHP
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
关于webuploader插件使用过程遇到的小问题
2016/11/07 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
Python fileinput模块使用实例
2015/05/28 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
Django model select的多种用法详解
2019/07/16 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
Araks官网:纽约内衣品牌
2020/10/15 全球购物
大学生个人求职信范文
2013/09/21 职场文书
红旗团支部事迹材料
2014/01/27 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
体育部部长竞选稿
2015/11/21 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android