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几个不错的函数 $$()
Oct 09 Javascript
IE php关于强制下载文件的代码
Aug 23 Javascript
javascript setTimeout和setInterval 的区别
Dec 08 Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
Mar 21 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 Javascript
深入理解javascript中defer的作用
Dec 11 Javascript
原生javascript实现隔行换色
Jan 04 Javascript
手机端转盘抽奖代码分享
Sep 10 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Dec 15 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
echarts学习笔记之图表自适应问题详解
Nov 22 Javascript
Javascript中的this,bind和that使用实例
Dec 05 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网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
ThinkPHP多表联合查询的常用方法
2020/03/24 PHP
PHP中读取文件的几个方法总结(推荐)
2016/06/03 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
python实现将文本转换成语音的方法
2015/05/28 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
JDK安装目录下有哪些内容
2014/08/25 面试题
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
金鑫耀Java笔试题
2014/09/06 面试题
函授毕业生自我鉴定
2013/11/06 职场文书
给老师的道歉信
2014/01/11 职场文书
实验室的标语
2014/06/20 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
优秀党员申报材料
2014/12/18 职场文书
谢师宴邀请函
2015/02/02 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
小学英语教学反思范文
2016/02/15 职场文书
Python开发五子棋小游戏
2022/05/02 Python