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使用手册之三 CSS操作
Mar 24 Javascript
Extjs优化(一)删除冗余代码提高运行速度
Apr 15 Javascript
jQuery实现的五子棋游戏实例
Jun 13 Javascript
原生JS仿QQ阅读点击展开、收起效果
Mar 08 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
详解微信小程序开发用户授权登陆
Apr 24 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
May 22 Javascript
微信小程序如何调用图片接口API并居中显示
Jun 29 Javascript
Node配合WebSocket做多文件下载以及进度回传
Nov 07 Javascript
highcharts.js数据绑定方式代码实例
Nov 13 Javascript
Jquery ajax书写方法代码实例解析
Jun 12 jQuery
解决vue单页面应用进入页面加载所有 js 的问题
Aug 12 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
使用eAccelerator加密PHP程序
2008/10/03 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
javascript实现5秒倒计时并跳转功能
2019/06/20 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
vue常用指令代码实例总结
2020/03/16 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
美国名牌太阳镜折扣网站:Eyedictive
2017/05/15 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
大学生收银员求职信分享
2014/01/02 职场文书
搞笑爱情保证书
2014/04/29 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
党支部意见范文
2015/06/02 职场文书
车辆挂靠协议书
2016/03/23 职场文书