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 相关文章推荐
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
几个有趣的Javascript Hack
Jul 24 Javascript
jquery异步跨域访问代码
Jun 28 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
Jan 07 Javascript
AngularJS中的API(接口)简单实现
Jul 28 Javascript
jQuery实现移动端手机商城购物车功能
Sep 24 Javascript
Angularjs手动解析表达式($parse)
Oct 12 Javascript
React Native实现地址挑选器功能
Oct 24 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 Javascript
js中apply()和call()的区别与用法实例分析
Aug 14 Javascript
Vue项目引进ElementUI组件的方法
Nov 11 Javascript
JavaScript实现更换背景图片
Oct 18 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的autoload自动加载机制使用说明
2010/12/28 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
JS实现小米轮播图
2020/09/21 Javascript
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
学习和使用python的13个理由
2019/07/30 Python
django创建超级用户过程解析
2019/09/18 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
护士实习生自我鉴定范文
2013/12/10 职场文书
给学校建议书范文
2014/05/13 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
优秀创业计划书分享
2019/07/19 职场文书