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 相关文章推荐
复制本贴标题和地址的js代码
Jul 01 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
Feb 04 Javascript
jquery延迟加载外部js实现代码
Jan 11 Javascript
Jquery 切换不同图片示例代码
Dec 05 Javascript
使用POST方式弹出窗口的两种方法示例介绍
Jan 29 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
JQuery动画animate的stop方法使用详解
May 09 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
layui前段框架日期控件使用方法详解
May 19 Javascript
Three.js开发实现3D地图的实践过程总结
Nov 20 Javascript
Angular学习教程之RouterLink花式跳转
May 03 Javascript
vue抽出组件并传值实例
Jul 31 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连接Oracle for NT 远程数据库
2006/10/09 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
基于php判断客户端类型
2016/10/14 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
完美解决AJAX跨域问题
2013/11/01 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
Python学习资料
2007/02/08 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
Django权限控制的使用
2021/01/07 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
房地产开盘策划方案
2014/02/10 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书