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 相关文章推荐
40个新鲜出炉的jQuery 插件和免费教程[上]
Jul 24 Javascript
javascript向flash swf文件传递参数值注意细节
Dec 11 Javascript
Jquery 动态生成表格示例代码
Dec 24 Javascript
JS+CSS实现的拖动分页效果实例
May 11 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
May 15 Javascript
JavaScript禁止复制与粘贴的实现代码
May 16 Javascript
javascript验证内容为数字以及长度为10的简单实例
Aug 20 Javascript
javascript实现多张图片左右无缝滚动效果
Mar 22 Javascript
JS获取数组中出现次数最多及第二多元素的方法
Oct 27 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
js 实现 list转换成tree的方法示例(数组到树)
Aug 18 Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 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数组应用之比较两个时间的相减排序
2008/08/18 PHP
php中设置多级目录session的问题
2011/08/08 PHP
ThinkPHP3.1数据CURD操作快速入门
2014/06/19 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
js获取地址栏参数的两种方法
2017/06/27 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
Python 中 list 的各项操作技巧
2017/04/13 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
python中sys模块是做什么用的
2020/08/16 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
python中使用np.delete()的实例方法
2021/02/01 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
泰国国际航空公司官网:Thai Airways International
2019/12/04 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
县优秀教师事迹材料
2014/01/31 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
党小组考察意见
2015/06/02 职场文书