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 插件 人性化的消息显示
Jan 21 Javascript
跨域表单提交状态的变相判断代码
Nov 12 Javascript
浏览器打开层自动缓慢展开收缩实例代码
Jul 04 Javascript
Query中click(),bind(),live(),delegate()的区别
Nov 19 Javascript
jQuery Ajax中的事件详细介绍
Apr 16 Javascript
javascript实现checkbox全选的代码
Apr 30 Javascript
js实现仿阿里巴巴城市选择框效果实例
Jun 24 Javascript
基于JS模仿windows文件按名称排序效果
Jun 29 Javascript
详解JavaScript中数组的reduce方法
Dec 02 Javascript
Vue实现底部侧边工具栏的实例代码
Sep 03 Javascript
Vue组件系列开发之模态框
Apr 18 Javascript
layui实现数据表格隐藏列的示例
Oct 25 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开发框架myqee新手快速入门教程
2014/07/14 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
用PHP代码给图片加水印
2015/07/01 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
laravel自定义分页效果
2017/07/23 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
学习面向对象之面向对象的术语
2010/11/30 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
vue 使用rules对表单字段进行校验的步骤
2020/12/25 Vue.js
Python脚本实现格式化css文件
2015/04/08 Python
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
python中的set实现不重复的排序原理
2018/01/24 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
python实现log日志的示例代码
2018/04/28 Python
基于Python log 的正确打开方式
2018/04/28 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
五一手机促销方案
2014/03/08 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
无工作证明怎么写
2015/06/15 职场文书
生产实习心得体会范文
2016/01/22 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis
CSS3实现指纹特效代码
2022/03/17 HTML / CSS