对象转换成原始值
对象到布尔:比较简单所有对象到布尔都是true,包括包装类new Boolean(false)是一个对象而不是原始值,它将转换为true
对象到数字,对象到字符串比较复杂一些。注意这里讨论的是本地对象,不包含宿主对象(例如浏览器定义的对象)
所有对象继承了两个转换方法。
第一种toString()
它的作用是返回一个反映这个对象的字符串。默认的toString()方法并不会返回一个有趣的值。
很多类定义了特定版本的toString()方法:
- 数组的toString()方法将每个数组元素转换为一个字符串,并在元素之间添加逗号合并成结果字符串
- 函数类的toString()方法返回这个函数的实现定义的表示方式。通常是将用户定义的函数转换为Javascript源代码字符串
- 日期类toString()返回一个可读的日期和时间字符串。
- RegExp类toString()将返回RegExp对象转换为表示正则表达式直接量字符串。
例:
1 [1,2,3].toString()//=>”1,2,3” 2 3 (function(x){f(x);}).toString()//=>” function(x){\nf(x);\n}” 4 5 /\d+/g.toString()//=>”/\\d+/g” 6 7 newDate(2010,0,1).toString() //=>”Fri Jan 01 2010 00:00:00 GMT-0800(PST)” 8 9
第二种转换对象的函数是valueOf()。
对象是复合值,而且大多数对象无法真正表示一个原始值。数组、函数和正则表达式简单地继承了这个默认方法,调用这些类型的实例的valueOf()方法只是简单地返回对象本身。日期类的valueOf方法会返回一个内部表示:1970年1月1日以来的毫秒数如
1 var d = new Date(2010,0,1) 2 3 d.valueOf() //126332800000
通常情况下对象是通过toString()和valueOf()方法,就可以做到对象到字符串和对象到数字的转换。但也有特殊场景。后面会提到。
对象到字符串的转换:
a. 如果具有toString()方法,则调用这个方法,如果它返回一个原始值,js将其转换为字符串,并返回这个字符结果。原始值到字符串的转换。
b. 如果没有toString()或者这个方法并不返回一个原始值,那么js会去调用valueOf()。如果有调用它,如果返回值是原始值。则将其转换成字符串。
c. 如果没有toString()或valueOf()获得一个原始值,因此会抛出一个类型错误异常。
对象到数值的转换:
a. 如果对象具有valueOf()方法,后者返回一个原始值,则javascript 将这个原始值转换为数字并返回这个数字
b. 否则,如果对象具有toString() 方法,后者返回一个原始值,则js将这个原始值转换返回
c. 否则,js报类型错误。
对象的转化都是通过函数获得原始值在转化成想要的类型,如果不能获得原始值就报错。
如果运算符”+”用作对象的话。则js使用特殊的方式将对象转换成原始值。而不是使用其它算数运行符的方法执行对象到数字的转换,“==”运算符与此类似。如果将对象和一个原始值比较,则转换将会遵照对象到原始值的转换方式进行。
“+”和 “==” 应用对象到原始值的转换:基本上是应用对象到数字的转换,先调用valueOf()
日期对象比较特殊它会使用对象到字符串的转换模式。而且这里所说的通过valueOf()和toString()转换的原始值会直接使用,而不会强制转换为数字和字符串。
“<”运算符以及其它关系运算符也会做对象到原始值的转换,但要除去日期对象的特殊情形:任何对象都会先尝试调用valueOf(),然后toString(),不管得到的原始值是否直接使用,它都不会进一步被转换成数字或字符串
“+”,“==”,“!=”是唯一执行这种特殊字符串到原始值转换的方式的运算符