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 创建书签小工具之理论
Feb 25 Javascript
js新闻滚动 js如何实现新闻滚动效果
Jan 07 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
Aug 06 Javascript
jquery使用remove()方法删除指定class子元素
Mar 26 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
Dec 21 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
Jun 08 jQuery
浅谈vue+webpack项目调试方法步骤
Sep 11 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
javascript匿名函数中的'return function()'作用
Oct 15 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 Javascript
vue form check 表单验证的实现代码
Dec 09 Javascript
一篇文章看懂JavaScript中的回调
Jan 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
四月新番又没了,《Re:从零开始的异世界生活》第二季延期至7月播出
2020/05/06 日漫
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
jquery等待效果示例
2014/05/01 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
Python列表计数及插入实例
2014/12/17 Python
Python中自定义函数的教程
2015/04/27 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
Python bisect模块原理及常见实例
2020/06/17 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
巴西女装购物网站:Eclectic
2018/04/24 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
工作的心得体会
2013/12/31 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
供货协议书
2014/04/22 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python