阐明
所有的对象都继承有 toString() 和 valueOf() 办法,对象到字符串,对象到数字的转换,会通过调用待转换对象的这两个办法中的一个来实现。
解释
toString() 办法的作用是:
返回一个反映这个对象的字符串,而很多类都定义了不同版本的 toString()。
对象 | 操作 |
---|---|
默认 | 返回“[object class]”,其中 class 是对象类型的名称。其中 class 是该对象的类:值为 ”Object”、“String”、“Number”、“Function”、“Window”、“Document”、等。 |
Array | 将 Array 的元素转换为字符串。后果字符串由逗号分隔,且连接起来。 |
Boolean | 如果 Boolean 值是 true,则返回“true”。否则,返回“false”。 |
Date | 返回日期的文字表示法。 |
Error | 返回一个蕴含相干谬误音讯的字符串。 |
Function | 返回如下格局的字符串,其中 functionname 是被调用 toString 办法函数的名称:function functionname() { [native code] } |
RegExp | 返回正则表达式间接量的字符串 |
Number | 返回数字的文字示意。 |
String | 返回 String 对象的值。 |
({}.toString()); //=> "[object Object]"
[1,2].toString(); //=> "1,2"
true.toString(); //=> "true"
new Date(1970,0,1).toString(); //=> "Thu Jan 01 1970 00:00:00 GMT+0800 (CST)"
Error("一个错误信息").toString(); //=> "Error: 一个错误信息"
(function (x){return x}).toString(); //=> "function (x){return x}"
/\d/.toString(); //=> "/\\d/" 或者 "/\d/" 浏览器不同返回也可能会不同
valueOf() 办法,它的作用是:
如果对象存在任意原始值,它就默认将对象转换为示意它的原始值,如果对象是复合值,而且大多数对象无奈真正示意为一个原始值,因而默认的 valueOf() 办法简略地返回对象自身,而不是返回一个原始值。
数组、函数、和正则表达式简略的继承了这个默认办法,调用这些类型的实例的 valueOf() 办法只是简答返回对象自身。
日期类定义的 valueOf() 办法会返回它的一个外部示意:1970 年 1 月 1 日以来的毫秒数。
[1,2].valueOf(); //=> [1,2]
(function (){}).valueOf(); //=> function (){}
/\d/.valueOf(); //=> /\d/
new Date().valueOf(); //=> 1502941383029
原始值:不可变更的值,包含 undefined、null、布尔值、数字、和字符串。
看上面这张图,列出了一些根本的类型转换,这张图来自 JavaScript 权威指南。
好了,咱们当初曾经理解 toString() 办法 和 valueOf() 办法了,下来咱们来说说,对象到字符串和对象到数字的转换。
对象到字符串的转换:
1、如果对象具备 toString() 办法,则调用这个办法。如果她返回一个原始值,JavaScript 将这个值转换为字符串(如果自身不是字符串的话),并返回这个字符串后果。
2、如果对象没有 toString() 办法,或者这个办法并不返回一个原始值,那么 JavaScript 会调用 valueOf() 办法。如果存在这个办法,则 JavaScript 调用它。如果返回值是原始值,JavaScript 将这个值转换为字符串(如果自身不是字符串的话),并返回这个字符串后果。
3、否则,JavaScript 无奈从 toString() 或者 valueOf() 取得一个原始值,因而这时它将抛出一个类型谬误异样。
对象到数字的转换:
1、如果对象具备 valueOf() 办法,后者返回一个原始值,则 JavaScript 将这个原始值转换为数字(如果需要的话)并返回这个数字。
2、否则,如果对象具备 toString() 办法,后者返回一个原始值,则 JavaScript 将其转化并返回。
3、否则,JavaScript 抛出一个类型谬误异样。
所以这就解释了,为什么空数组会被转换为数字 0,为什么具备单个元素的数组同样会转换成一个数字。
数组继承了默认的 valueOf() 办法,这个办法返回一个对象而不是一个原始值,因而,数组到数字的转换则调用 toString() 办法。空数组转换为空字符串,空字符串转换为数字 0。
含有一个元素的数组转换为字符串的后果和这个元素转换字符串的后果一样。
如果数组只蕴含一个数字元素,这个数字转换为字符串,在转换回数字。
JavaScript 中的 ”+“运算符能够进行数学加法和字符串连贯操作。如果它的其中一个操作数是对象,则 JavaScript 将应用非凡的办法将对象转换为原始值,而不是应用其余算术运算符的办法执行对象到数字的转换,”= =” 相等运算符与此相似。如果将对象和一个原始值比拟,则转换将会遵循对象到原始值的转换形式进行。
“+”和 “= =” 利用的对象到原始值的转换蕴含日期对象的一种非凡情景。日期类是 JavaScript 语言外围中惟一的事后定义类型,它定义了有意义的向字符串和数字类型的转换。
对于所有非日期的对象来说,对象到原始值的转换基本上是对象到数字的转换(首先调用 valueOf()),日期对象则应用对象到字符串的转换模式,然而,这里的转换和上文讲述的并不完全一致:通过 valueOf() 或者 toString() 返回的原始值将被间接应用,而不会被强制转换为数字或字符串。
和 ”= =“一样,”<“ 运算符以及其余关系运算符也会做对象到原始值的转换,但要除去日期对象的非凡情景:任何对象都会首先尝试调用 valueOf(),而后调用 toString()。不论失去的原始值是否间接应用,它都不会进一步被转换为数字或字符串。
总结
本文说了说 toString() 办法 和 valueOf() 办法的基础知识,文中的许多概念是出自 JavaScript 权威指南一书,大家能够多看看书。