全面解析JavaScript中的valueOf与toString方法(推荐)


Posted in Javascript onJune 14, 2016

可以这样说,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。在程序应用非常广泛。下面我们逐一来给大家介绍下。

JavaScript 的 valueOf() 方法

valueOf() 方法可返回 Boolean 对象的原始值。

用法booleanObject.valueOf(),返回值为booleanObject 的原始布尔值。如果调用该方法的对象不是 Boolean,则抛出异常 TypeError。

<script type="text/javascript">
var boo = new Boolean(false);
document.write(boo.valueOf());
</script>

以上脚本会输出false。

JavaScript 的 toString() 方法

toString() 方法可把一个逻辑值转换为字符串,并返回结果。

用法 booleanObject.toString(),返回值根据原始布尔值或者 booleanObject 对象的值返回字符串 "true" 或 "false"。如果调用该方法的对象不是 Boolean,则抛出异常 TypeError。

在 Boolean 对象被用于字符串环境中时,此方法会被自动调用。

下面脚本将创建一个 Boolean 对象,并把它转换成字符串:

<script type="text/javascript">
var boo = new Boolean(true);
document.write(boo.toString());
</script>

脚本输出:true。

先看一例:

var aaa = {
i: 10,
valueOf: function() { return this.i+30; },
toString: function() { return this.valueOf()+10; }
}
alert(aaa > 20); // true
alert(+aaa); // 40
alert(aaa); // 50

之所以有这样的结果,因为它们偷偷地调用valueOf或toString方法。但如何区分什么情况下是调用了哪个方法呢,我们可以通过另一个方法测试一下。由于用到console.log,请在装有firebug的FF中实验!

var bbb = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
},
valueOf: function() {
console.log('valueOf');
return this.i;
}
}
alert(bbb);// 10 toString
alert(+bbb); // 10 valueOf
alert(''+bbb); // 10 valueOf
alert(String(bbb)); // 10 toString
alert(Number(bbb)); // 10 valueOf
alert(bbb == '10'); // true valueOf
alert(bbb === '10'); // false

乍一看结果,大抵给人的感觉是,如果转换为字符串时调用toString方法,如果是转换为数值时则调用valueOf方法,但其中有两个很不和谐。一个是alert(''+bbb),字符串合拼应该是调用toString方法……另一个我们暂时可以理解为===操作符不进行隐式转换,因此不调用它们。为了追究真相,我们需要更严谨的实验。

var aa = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
}
}
alert(aa);// 10 toString
alert(+aa); // 10 toString
alert(''+aa); // 10 toString
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 toString
alert(aa == '10'); // true toString

再看valueOf。

var bb = {
i: 10,
valueOf: function() {
console.log('valueOf');
return this.i;
}
}
alert(bb);// [object Object]
alert(+bb); // 10 valueOf
alert(''+bb); // 10 valueOf
alert(String(bb)); // [object Object]
alert(Number(bb)); // 10 valueOf
alert(bb == '10'); // true valueOf

发现有点不同吧?!它没有像上面toString那样统一规整。对于那个[object Object],我估计是从Object那里继承过来的,我们再去掉它看看。

Object.prototype.toString = null;
var cc = {
i: 10,
valueOf: function() {
console.log('valueOf');
return this.i;
}
}
alert(cc);// 10 valueOf
alert(+cc); // 10 valueOf
alert(''+cc); // 10 valueOf
alert(String(cc)); // 10 valueOf
alert(Number(cc)); // 10 valueOf
alert(cc == '10'); // true valueOf

如果只重写了toString,对象转换时会无视valueOf的存在来进行转换。但是,如果只重写了valueOf方法,在要转换为字符串的时候会优先考虑valueOf方法。在不能调用toString的情况下,只能让valueOf上阵了。对于那个奇怪的字符串拼接问题,可能是出于操作符上,翻开ECMA262-5 发现都有一个getValue操作。嗯,那么谜底应该是揭开了。重写会加大它们调用的优化高,而在有操作符的情况下,valueOf的优先级本来就比toString的高。

以上所述是小编给大家介绍的JavaScript中的valueOf与toString方法的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
IE下js调试工具Companion.JS
Oct 15 Javascript
jQuery实用基础超详细介绍
Apr 11 Javascript
jQuery each函数源码分析
May 25 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
Jan 18 Javascript
Vue中添加过渡效果的方法
Mar 16 Javascript
vue.js评论发布信息可插入QQ表情功能
Aug 08 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
Aug 29 Javascript
微信小程序实现手势滑动卡片效果
Aug 26 Javascript
微信小程序实现弹框效果
May 26 Javascript
js实现弹幕飞机效果
Aug 27 Javascript
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 Javascript
JavaScript函数中关于valueOf和toString的理解
Jun 14 #Javascript
Jquery基础之事件操作详解
Jun 14 #Javascript
好好了解一下Cookie(强烈推荐)
Jun 14 #Javascript
巧方法 JavaScript获取超链接的绝对URL地址
Jun 14 #Javascript
使用js获取地址栏参数的方法推荐(超级简单)
Jun 14 #Javascript
返回函数的JavaScript函数
Jun 14 #Javascript
js数组的五种迭代方法及两种归并方法(推荐)
Jun 14 #Javascript
You might like
PHP的pcntl多进程用法实例
2015/03/19 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
JQueryMiniUI按照时间进行查询的实现方法
2017/06/07 jQuery
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
vue项目使用微信公众号支付总结及遇到的坑
2018/10/23 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
Python基础教程之利用期物处理并发
2018/03/29 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
python之文件读取一行一行的方法
2018/07/12 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
python 实现简易的记事本
2020/11/30 Python
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
后天观后感
2015/06/08 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
react antd实现动态增减表单
2021/06/03 Javascript
实例详解Python的进程,线程和协程
2022/03/13 Python
Win11控制面板快捷键是什么?Win11打开控制面板的方法汇总
2022/07/07 数码科技