全面解析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实现的Email中的收件人效果(按del键删除)
Mar 20 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
Nov 28 Javascript
JQuery判断HTML元素是否存在的两种解决方法
Dec 26 Javascript
Javascript数据结构与算法之列表详解
Mar 12 Javascript
JavaScript中的fontsize()方法使用详解
Jun 08 Javascript
jquery,js简单实现类似Angular.js双向绑定
Jan 13 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
May 16 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
Sep 19 Javascript
tweenjs缓动算法的使用实例分析
Aug 26 Javascript
vue 中的 render 函数作用详解
Feb 28 Javascript
jquery自定义组件实例详解
Dec 31 jQuery
用javascript制作qq注册动态页面
Apr 14 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数字格式化
2006/12/06 PHP
PHP开发中常用的三个表单验证函数使用小结
2010/03/03 PHP
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
基于javascript实现贪吃蛇经典小游戏
2020/04/10 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
用Python代码来解图片迷宫的方法整理
2015/04/02 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
维护民族团结演讲稿
2014/08/27 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
2014年业务工作总结
2014/11/17 职场文书
先进人物事迹材料
2014/12/29 职场文书
赔偿协议书
2015/01/27 职场文书
如何写通讯稿
2015/07/22 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书