【js学习笔记-022】-- 对象转换为原始值

来源:互联网 发布:中国手工网络大学 编辑:程序博客网 时间:2024/06/03 07:58

对象到布尔:比较简单所有对象到布尔都是true,包括包装类new Boolean(false)是一个对象而不是原始值,它将转换为true

 

对象到数字对象到字符串比较复杂一些。注意这里讨论的是本地对象,不包含宿主对象(例如浏览器定义的对象)

 

所有对象继承了两个转换方法。

第一种toString(),它的作用是返回一个反映这个对象的字符串。默认的toString()方法并不会返回一个有趣的值。

很多类定义了特定版本的toString()方法:

数组的toString()方法将每个数组元素转换为一个字符串,并在元素之间添加逗号合并成结果字符串

函数类的toString()方法返回这个函数的实现定义的表示方式。通常是将用户定义的函数转换为Javascript源代码字符串

日期类toString()返回一个可读的日期和时间字符串。

RegExp类toString()将返回RegExp对象转换为表示正则表达式直接量字符串。

例:

 [1,2,3].toString()//=>”1,2,3”

  (function(x){f(x);}).toString()//=>” function(x){\nf(x);\n}”

  /\d+/g.toString()//=>”/\\d+/g”

 newDate(2010,0,1).toString() //=>”Fri Jan 01 2010 00:00:00 GMT-0800(PST)”

 

另一种转换对象的函数是valueOf()。对象是复合值,而且大多数对象无法真正表示一个原始值。数组、函数和正则表达式简单地继承了这个默认方法,调用这些类型的实例的valueOf()方法只是简单地返回对象本身。日期类的valueOf方法会返回一个内部表示:1970年1月1日以来的毫秒数如

var d = new Date(2010,0,1)

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(),不管得到的原始值是否直接使用,它都不会进一步被转换成数字或字符串

“+”,“==”,“!=”是唯一执行这种特殊字符串到原始值转换的方式的运算符。

原创粉丝点击