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 相关文章推荐
lib.utf.js
Aug 21 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
Feb 07 Javascript
JSON语法五大要素图文介绍
Dec 04 Javascript
ie下jquery.getJSON的缓存问题的处理方法
Mar 29 Javascript
JQuery中form验证出错信息的查看方法
Oct 08 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
Jan 15 Javascript
js格式化时间小结
Nov 03 Javascript
学习Bootstrap滚动监听 附调用方法
Jul 02 Javascript
使用vue编写一个点击数字计时小游戏
Aug 31 Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 Javascript
vue调用高德地图实例代码
Apr 28 Javascript
解析vue data不可以使用箭头函数问题
Jul 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
如何获得PHP相关资料
2006/10/09 PHP
php字符串截取的简单方法
2013/07/04 PHP
跟我学Laravel之路由
2014/10/15 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
浅谈php提交form表单
2015/07/01 PHP
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
父母寄语大全
2014/04/12 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
学校运动会报道稿
2014/09/23 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
2019个人半年工作总结
2019/06/21 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
Python多个MP4合成视频的实现方法
2021/07/16 Python
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript