转载一篇关于toString和valueOf
可以这样说,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。在程序应用非常广泛。下面我们逐一来给大家介绍下。
JavaScript 的 valueOf() 方法
valueOf() 方法可返回 Boolean 对象的原始值。
用法booleanObject.valueOf(),返回值为booleanObject 的原始布尔值。如果调用该方法的对象不是 Boolean,则抛出异常 TypeError。
1
2
3
4
|
<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 对象,并把它转换成字符串:
1
2
3
4
|
<script type= "text/javascript" > var boo = new Boolean( true ); document.write(boo.toString()); </script> |
脚本输出:true。
先看一例:
1
2
3
4
5
6
7
8
|
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中实验!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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方法……另一个我们暂时可以理解为===操作符不进行隐式转换,因此不调用它们。为了追究真相,我们需要更严谨的实验。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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那里继承过来的,我们再去掉它看看。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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的高。可以这样说,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。在程序应用非常广泛。下面我们逐一来给大家介绍下。
JavaScript 的 valueOf() 方法
valueOf() 方法可返回 Boolean 对象的原始值。
用法booleanObject.valueOf(),返回值为booleanObject 的原始布尔值。如果调用该方法的对象不是 Boolean,则抛出异常 TypeError。
1
2
3
4
|
<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 对象,并把它转换成字符串:
1
2
3
4
|
<script type= "text/javascript" > var boo = new Boolean( true ); document.write(boo.toString()); </script> |
脚本输出:true。
先看一例:
1
2
3
4
5
6
7
8
|
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中实验!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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方法……另一个我们暂时可以理解为===操作符不进行隐式转换,因此不调用它们。为了追究真相,我们需要更严谨的实验。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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那里继承过来的,我们再去掉它看看。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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的高。
可以这样说,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。在程序应用非常广泛。下面我们逐一来给大家介绍下。
JavaScript 的 valueOf() 方法
valueOf() 方法可返回 Boolean 对象的原始值。
用法booleanObject.valueOf(),返回值为booleanObject 的原始布尔值。如果调用该方法的对象不是 Boolean,则抛出异常 TypeError。
1
2
3
4
|
<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 对象,并把它转换成字符串:
1
2
3
4
|
<script type= "text/javascript" > var boo = new Boolean( true ); document.write(boo.toString()); </script> |
脚本输出:true。
先看一例:
1
2
3
4
5
6
7
8
|
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中实验!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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方法……另一个我们暂时可以理解为===操作符不进行隐式转换,因此不调用它们。为了追究真相,我们需要更严谨的实验。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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那里继承过来的,我们再去掉它看看。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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的高。
转载一篇关于toString和valueOf的更多相关文章
- javascript之toString()和valueOf()函数
1.我们为什么要了解这两种方法 众所周知,toString()函数和valueOf函数,这两个函数是Object类的对象生来就拥有的,而且他们还可以允许我们重写,那么,这两个函数到底有什么用呢? 从名 ...
- JavaScript系列-----Object之toString()和valueOf()方法 (2)
深入理解toString()和valueOf()函数 1.我们为什么要了解这两种方法 众所周知,toString()函数和valueOf函数,这两个函数是Object类的对象生来就拥有的,而且他们还可 ...
- toString和valueOf使得对象访问时显示一个特定格式的字符串,但是可以进行数字运算
作用 toString()的作用是返回一个反映这个对象的字符串; valueOf()的作用是返回它相应的原始值; 异同点 共同点:在 JavaScript 中,toString()方法和valueOf ...
- 简单说 JavaScript中的tostring( ) 与 valueOf( )方法
说明 所有的对象都继承有toString() 和 valueOf() 方法,对象到字符串,对象到数字的转换,会通过调用待转换对象的这两个方法中的一个来完成. 解释 toString( )方法的作用是: ...
- 探究toString()和valueOf()
1.用法如下:toString()方法:返回对象的字符串表示. 对象 操作 Array 将 Array 的元素转换为字符串.结果字符串由逗号分隔,且连接起来. Boolean 如果 Boolean 值 ...
- js函数--关于toString和valueOf
js函数--关于toString和valueOf 标签(空格分隔): JavaScript 今天看到一个试题,实现如下语法的功能: var a = add(2)(3)(4); //9 这个就是一个高阶 ...
- JavaScript引用类型之Array数组的toString()和valueof()方法的区别
一.转换方法 1.在JavaScript中几乎所有对象都具有toLocaleString().toString和valueof()方法,因为,所有的对象都继承自Object,而前面所说的方法都是Obj ...
- 上一篇括号配对让人联想起catalan数,顺便转载一篇归纳的还不错的文章
转载请注明来自souldak,微博:@evagle 怎么样才是合法的组合? 只要每一时刻保证左括号的数目>=右括号的数目即可. 直接递归就行,每次递归加一个括号,左括号只要还有就能加,右括号要保 ...
- 区分javascript中的toString(),toLocaleString(),valueOf()方法
首先我们随意创建一个对象,这很简单,打开FF浏览器的Firebug切换到控制台或者打开webkit浏览器的审查元素功能. 输入以下内容: var obj1=[1,2,3,4,5] var obj2=[ ...
随机推荐
- zabbix3.0.4通过自定义shell脚本添加对关键日志文件的监控
zabbix添加对自定义无规则日志文件的监控 项目背景及思路: zabbix自带有针对日志文件的监控,自带的监控只能监控到指定文件或者正则匹配的固定日志文件,但当需要监控的文件名没有规律的时候自带监控 ...
- nginx转发
1.下载nginx:官网(http://nginx.org)右侧下载,进入下载页,选在需要下载的版本 2.将压缩包解压到指定的目录下 (D:\Environments\nginx-1.8.0) 3.启 ...
- vue系列之webstrom的设置
1.安装vue插件,方法 Setting->Plugins,点击Plugins,在右边输入vue,找到相应插件,然后安装 2.创建vue模板 注意红圈里面的 3.设置vue文件支持的样式 注意: ...
- 基于vue的UI框架集锦
前端框架百花齐放.争奇斗艳,令人眼花缭乱.大神们一言不合就整一个框架出来,另小白们无所适从.下面罗列了一些比较优秀的UI框架,Star多的大都是老牌劲旅,Star少的许多是后起之秀. (1)Eleme ...
- jq中Deferred对象的使用
var d=$.Deferred(); //deferred下面的方法有: // ["resolve", "resolveWith", "reject ...
- hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误
hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask错误 起因 ...
- ERP打印入库单(四十)
需求描述:此购进单的基本信息,购进单位,入库单位,入库时间……此购进单批号,产品名称,生产企业,等基本信息.实现能够循环加载打印.本单金额小计,整单金额合计计算.技术需求:界面设计,循环加载数据实现函 ...
- lldp
https://wenku.baidu.com/view/b9d831f26294dd88d0d26b20.html
- SpringBank 开发日志 一种简单的拦截器设计实现
当交易由Action进入Service之前,需要根据不同的Service实际负责业务的不同,真正执行Service的业务逻辑之前,做一些检查工作.这样的拦截器应该是基于配置的,与Service关联起来 ...
- flex布局简介
一.概述 浮动在移动布局中不再重要,flex盒模型越来越重要. flexbox经历过三个版本,主要区别是2009年到2012年之间的语法变化. 最新的语法和现在规范是同步的(例display:flex ...