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 相关文章推荐
YUI模块开发原理详解
Nov 18 Javascript
JavaScript中实现单体模式分享
Jan 29 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
Jun 12 Javascript
angular4自定义组件详解
Sep 28 Javascript
template.js前端模板引擎使用详解
Oct 10 Javascript
JS从非数组对象转数组的方法小结
Mar 26 Javascript
学习JS中的DOM节点以及操作
Apr 30 Javascript
React Router V4使用指南(精讲)
Sep 17 Javascript
vue中如何去掉空格的方法实现
Nov 09 Javascript
Vue仿微信app页面跳转动画效果
Aug 21 Javascript
Vue通过WebSocket建立长连接的实现代码
Nov 05 Javascript
Javascript中的解构赋值语法详解
Apr 02 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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
使用Apache的rewrite
2021/03/09 Servers
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
jquery validate.js表单验证入门实例(附源码)
2015/11/10 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
[36:02]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第一局
2016/02/28 DOTA
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
使用Python的PIL模块来进行图片对比
2016/02/18 Python
浅谈python中的变量默认是什么类型
2016/09/11 Python
Flask数据库迁移简单介绍
2017/10/24 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
好邻里事迹材料
2014/01/16 职场文书
十佳护士先进事迹
2014/05/08 职场文书
幼儿教师自我剖析材料
2014/09/29 职场文书
免职通知
2015/04/23 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
react antd实现动态增减表单
2021/06/03 Javascript
详解Java实现数据结构之并查集
2021/06/23 Java/Android
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫