全面解析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 相关文章推荐
Exitjs获取DataView中图片文件名
Nov 26 Javascript
javascript开发中因空格引发的错误
Nov 08 Javascript
js获得地址栏?问号后参数的方法
Aug 08 Javascript
一个简单的全屏图片上下打开显示网页效果示例
Jul 08 Javascript
一个字符串反转函数可实现字符串倒序
Sep 15 Javascript
javascript显式类型转换实例分析
Apr 25 Javascript
Bootstrap实现弹性搜索框
Jul 11 Javascript
Bootstrap导航条的使用和理解3
Dec 14 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
深入理解vue2.0路由如何配置问题
Jul 18 Javascript
React 组件转 Vue 组件的命令写法
Feb 28 Javascript
使用FormData实现上传多个文件
Dec 04 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学习笔记(三)操作符与控制结构
2011/08/06 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
2019/03/21 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
Prototype Hash对象 学习
2009/07/19 Javascript
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
Python中生成器和迭代器的区别详解
2018/02/10 Python
python最长回文串算法
2018/06/04 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
python 日志 logging模块详细解析
2020/03/31 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
2020/05/27 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
linux面试题参考答案(7)
2014/07/24 面试题
毕业生求职简历的自我评价
2013/10/23 职场文书
办公室年终个人自我评价
2013/10/28 职场文书
企业总经理职责
2014/02/02 职场文书
秋季开学典礼主持词
2014/03/19 职场文书
2015年小学总务工作总结
2015/07/21 职场文书