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 options属性集合操作代码
Dec 28 Javascript
JQuery跨Iframe选择实现代码
Aug 19 Javascript
js如何实现设计模式中的模板方法
Jul 23 Javascript
jquery判断元素的子元素是否存在的示例代码
Feb 04 Javascript
实现图片预加载的三大方法及优缺点分析
Nov 19 Javascript
JavaScript编程中容易出BUG的几点小知识
Jan 31 Javascript
js实现模拟计算器退格键删除文字效果的方法
May 07 Javascript
jquery事件与绑定事件
Mar 16 Javascript
vue 路由嵌套高亮问题的解决方法
May 17 Javascript
原生js实现二级联动菜单
Nov 27 Javascript
vue实现五子棋游戏
May 28 Javascript
JavaScript前端面试扁平数据转tree与tree数据扁平化
Jun 14 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
解析CodeIgniter自定义配置文件
2013/06/18 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
js取得url地址参数实例
2013/02/22 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
2016/11/16 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
详解package.json版本号规则
2019/08/01 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
Python编程中对文件和存储器的读写示例
2016/01/25 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
Python3模拟登录操作实例分析
2019/03/12 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
python数组循环处理方法
2019/08/26 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
Python实现序列化及csv文件读取
2020/01/19 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
优秀中专生推荐信
2013/11/17 职场文书
物流仓管员工作职责
2014/01/06 职场文书
人力资源主管岗位职责
2014/01/29 职场文书
销售经理工作职责
2014/02/03 职场文书
档案保密承诺书
2014/06/03 职场文书
青年志愿者活动方案
2014/08/17 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
公司承诺书格式范文
2015/04/28 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书