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 相关文章推荐
JavaScript中的Screen屏幕对象
Jan 16 Javascript
javascript事件问题
Sep 05 Javascript
神奇的7个jQuery 3D插件整理
Jan 06 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
Jul 25 Javascript
实现只能输入数字的input不用replace方法
Sep 12 Javascript
Bootstrap每天必学之进度条
Nov 30 Javascript
javascript容错处理代码(屏蔽js错误)
Jan 20 Javascript
Vue实现路由跳转和嵌套
Jun 20 Javascript
基于Vue实例对象的数据选项
Aug 09 Javascript
vue语法之拼接字符串的示例代码
Oct 25 Javascript
微信小程序表单验证功能完整实例
Dec 01 Javascript
angular 实时监听input框value值的变化触发函数方法
Aug 31 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 获取一个月第一天与最后一天的代码
2010/05/16 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
php自定义函数实现二维数组按指定key排序的方法
2016/09/29 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
php实现登陆模块功能示例
2016/10/20 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
js文件缓存之版本管理详解
2013/07/05 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
在Django的模型中添加自定义方法的示例
2015/07/21 Python
Python二分查找详解
2015/09/13 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
numpy排序与集合运算用法示例
2017/12/15 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
Django实现表单验证
2018/09/08 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
通过实例解析Python调用json模块
2019/12/11 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
法国房车租赁网站:Yescapa
2019/08/26 全球购物
房地产销售计划书
2014/01/10 职场文书
大学生见习报告范文
2014/11/03 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
关于观后感的作文
2015/06/18 职场文书
学生病假条范文
2015/08/17 职场文书