全面解析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 相关文章推荐
js中跨域方法原理详解
Jul 19 Javascript
Highcharts使用简例及异步动态读取数据
Dec 30 Javascript
学习javascript面向对象 理解javascript原型和原型链
Jan 04 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
Jul 20 Javascript
Vue学习笔记进阶篇之过渡状态详解
Jul 14 Javascript
使用JS代码实现俄罗斯方块游戏
Aug 03 Javascript
js实现轮播图的完整代码
Oct 26 Javascript
微信小程序实现多选功能
Nov 04 Javascript
vue路由前进后退动画效果的实现代码
Dec 10 Javascript
解决一个微信号同时支持多个环境网页授权问题
Aug 07 Javascript
vue input标签通用指令校验的实现
Nov 05 Javascript
在vue中使用Echarts画曲线图的示例
Oct 03 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php 在文件指定行插入数据的代码
2010/05/08 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python函数返回值实例分析
2015/06/08 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
使用Python脚本zabbix自定义key监控oracle连接状态
2019/08/28 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
python 一维二维插值实例
2020/04/22 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
初中新生军训方案
2014/05/13 职场文书
销售员态度差检讨书
2014/10/26 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
工会积极分子个人总结
2015/03/03 职场文书
材料员岗位职责范本
2015/04/11 职场文书
大学军训心得体会800字
2016/01/11 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python