Javascript_备忘录2
今天备忘的是Object to Primitive Conversions,类类型到元类型的转换。主要备忘的是类类型到字符型和类类型到数值型(简称类字转换和类数转换)的转换,类类型到布尔型的转换以一个例子直接带过:
new Boolean(false);
上面的这一行代码生成了一个糖衣类如果要转换为布尔类型其转换结果是true。(类转换到布尔都是true)
类字转换和类数转换主要是通过toString()和valueOf()这两个函数,在Javascript中任何类都继承了这两个函数。默认的toString()方法不会输出有趣的值:
({x:1, y:2}).toString() // => "[object Object]"
所以许多类定义了自己特别的toString()方法:
[1,2,3].toString() // => "1,2,3" (function(x) { f(x); }).toString() // => "function(x) {\n f(x);\n}" /\d+/g.toString() // => "/\\d+/g" new Date(2010,0,1).toString() // => "Fri Jan 01 2010 00:00:00 GMT-0800 (PST)"
valueOf()函数就没toString()方法那么便利,因为它想把类类型转换到一种已定义的元类型,但是通常类类型是复合类型的即包含了很多元类型,所以valueOf()通常返回的是这个类本身。但是也有例外:
var d = new Date(2010, 0, 1); // January 1st, 2010, (Pacific time) d.valueOf() // => 1262332800000 -->毫秒
在Javascript中类字转换的步骤是:
- 检查toString()的存在,如果存在就调用,再如果返回的是元类型则Javascript将这元类型值转换为string。
- 如果不存在,则调用的是valueOf(),如果存在这函数并且调用后有元类型的值返回,则Javascript将这元类型值转为string。
- 如果都没元类型的值返回,则会抛出TypeError。
在Javascript中类数转换的步骤是:
- 先检查valueOf()方法的存在,如果存在并且调用后有元类型的值返回,则Javascript将这元类型值转换为数值型。
- 如果valueOf()方法不存在,则判定toString()方法是否存在,如果存在并且调用后返回元类型的值,则再转为数值型。
- 如果无元类型值返回则抛出TypeError。
以上的两个步骤我觉得比较多用于操作符的隐式转换,而且Date类在类数转换上比较特别,他是先弄toString()之后再valueOf():
var now = new Date(); // Create a Date object typeof (now + 1) // => "string": + converts dates to strings typeof (now - 1) // => "number": - uses object-to-number conversion now == now.toString() // => true: implicit and explicit string conversions now > (now -1) // => true: > converts a Date to a number