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 相关文章推荐
解决jQuery插件tipswindown与hintbox冲突
Nov 05 Javascript
js设置组合快捷键/tabindex功能的方法
Nov 21 Javascript
JavaScript调试技巧之console.log()详解
Mar 19 Javascript
如何在node的express中使用socket.io
Dec 15 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
Oct 12 Javascript
JavaScript中文件上传API详解
Apr 01 Javascript
AngularJS入门教程之模块化操作用法示例
Nov 02 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
Jan 22 Javascript
分享一个精简的vue.js 图片lazyload插件实例
Mar 13 Javascript
jQuery中过滤器的基本用法示例
Oct 11 jQuery
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
Feb 20 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
Jun 01 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正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
Jquery性能优化详解
2014/05/15 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
浅析javascript的return语句
2015/12/15 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
JS实现li标签的删除
2019/04/12 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Python基于回溯法解决01背包问题实例
2017/12/06 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
Javascript如何发送一个Ajax请求
2015/01/26 面试题
人力资源管理专业应届生求职信
2013/09/28 职场文书
如何撰写岗位职责
2014/02/01 职场文书
十八届三中全会个人学习材料
2014/02/13 职场文书
对公司合理化的建议书
2014/03/12 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
会计实训报告范文
2014/11/04 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书