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技术技巧大全(五)
Jan 22 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
Oct 15 Javascript
Jquery 获取checkbox的checked问题
Nov 16 Javascript
javascript右下角弹层及自动隐藏(自己编写)
Nov 20 Javascript
js控制容器隐藏出现防止样式变化的两种方法
Apr 25 Javascript
jquery控制select的text/value值为选中状态
Jun 03 Javascript
原生JS实现LOADING效果
Mar 16 Javascript
jQuery动态星级评分效果实现方法
Aug 06 Javascript
使用jQuery UI库开发Web界面的简单入门指引
Apr 22 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
Aug 11 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
Nov 17 Javascript
vue使用自定义指令实现拖拽
Jan 29 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/11/16 PHP
php GeoIP的使用教程
2011/03/09 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
PHP 8新特性简介
2020/08/18 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
使用js画图之饼图
2015/01/12 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
Python struct模块解析
2014/06/12 Python
python实现红包裂变算法
2016/02/16 Python
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
python 进程 进程池 进程间通信实现解析
2019/08/23 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
python解包用法详解
2021/02/17 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
2016年9月份红领巾广播稿
2015/12/21 职场文书
《刷子李》教学反思
2016/02/20 职场文书