全面解析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 相关文章推荐
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
Jan 06 Javascript
基于jquery &amp; json的省市区联动代码
Jun 26 Javascript
js对象与打印对象分析比较
Apr 23 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
Feb 17 Javascript
Javascript动画的实现原理浅析
Mar 02 Javascript
node.js调用C++开发的模块实例
Jul 03 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
Feb 12 Javascript
iview给radio按钮组件加点击事件的实例
Sep 30 Javascript
webpack多页面开发实践
Dec 18 Javascript
vue 点击按钮增加一行的方法
Sep 07 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
Dec 30 Javascript
js实现缓动动画
Nov 25 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自带的进位制之间的转换函数
2013/06/08 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
js实现下拉列表选中某个值的方法(3种方法)
2015/12/17 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
Python原始字符串(raw strings)用法实例
2014/10/13 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
Python提取网页中超链接的方法
2016/09/18 Python
Python 多线程实例详解
2017/03/25 Python
值得收藏的10道python 面试题
2019/04/15 Python
pandas 空数据处理方法详解
2019/11/02 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
大学军训感言400字
2014/03/11 职场文书
党委班子剖析材料
2014/08/21 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
大二学生自我检讨书
2014/10/23 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
导游词范文
2015/02/13 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
党内外群众意见范文
2015/06/02 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
七年级语文教学反思
2016/03/03 职场文书
python如何读取和存储dict()与.json格式文件
2022/06/25 Python