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 UI皮肤定制
Jul 27 Javascript
json 入门基础教程 推荐
Oct 31 Javascript
jQuery实现鼠标经过图片预览大图效果
Apr 10 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
Aug 16 Javascript
通过jquery 获取URL参数并进行转码
Aug 18 Javascript
jQuery Validation Plugin验证插件手动验证
Jan 26 Javascript
JS中BOM相关知识点总结(必看篇)
Nov 22 Javascript
Angular 输入框实现自定义验证功能
Feb 19 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
Nov 01 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
Feb 10 Javascript
json解析大全 双引号、键值对不在一起的情况
Dec 06 Javascript
three.js 实现露珠滴落动画效果的示例代码
Mar 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
Terran热键控制
2020/03/14 星际争霸
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
js数组去重的方法汇总
2015/07/29 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
2015/09/14 Javascript
js电话号码验证方法
2015/09/28 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
一些可能会用到的Node.js面试题
2019/06/15 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
python实现kNN算法
2017/12/20 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
2019/12/11 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
服装公司总经理岗位职责
2013/11/30 职场文书
网络书店创业计划书
2014/02/07 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
英语求职信范文
2014/05/23 职场文书
优秀会计求职信
2014/07/04 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
关于运动会的广播稿
2015/08/19 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
详解GaussDB for MySQL性能优化
2021/05/18 MySQL