alert( new Date() ) // The date in human-readable form alert( +new Date() ) // Microseconds till 1 Jan 1970
自己定义一个valueOf方法
var room = { num: 777, valueOf: function() { return this.num } } alert( +room ) // 777
不存在valueOf方法,但是存在toString方法时会调用此方法
var room = { num: 777, toString: function() { return this.num } } alert( room / 3 ) // 259
注意只需要返回简单数值类型即可(Numeric,String,Boolean),不一定非要返回数值;
装换为布尔值
装换表
|Value | Converted to…|
undefined, null false
Number 0, NaN become false, others - true.
String "" becomes false, any other - true
Object true
注意,字符"0"为true;
涉及到逻辑运算符会触发布尔装换;
但是也有比较奇怪的地方,看下面两例
alert( [0] == 0 ) // true alert( "\n0\n" == 0 ) // true alert( "\n0\n" == false ) // true //
if ([0]) alert(1) // 1, if treats [0] as true if ("\n0\n") alert(2) // 2, if treats "\n0\n" as true
仔细想想如何转换的,就可以理解了。==只比较值得结果,[0],“0”装换为数值后就是0,但是当他们是数组中的一项,或字符串时并非是空的。
再看一个比较奇怪的例子
alert( [] == ![] ) // true
首先,看右边![],逻辑非对[]进行布尔转换,依据上面的装换表,数组其实也是对象,object装换为真。所以右边![] = !true = false;
再看左边,对象与简单类型比较时,会按数值方式装换,没有valueOf,将使用toString进行装换(以逗号分隔的字符串)那么就装换为一个空的字符串''=false;
所以二者相等;
检测一下你是否真的掌握了数值装换,看看下面的题目能不能理解
6 / "3" = 2 "2" * "3" = 6 4 + 5 + "px" = "9px" "$" + 4 + 5 = "$45" "4" - 2 = 2 "4px" - 2 = NaN 7 / 0 = Infinity {}[0] = undefined parseInt("09") = "0" or "9" // octal or decimal, depends on the browser 5 && 2 = 2 2 && 5 = 5 5 || 0 = 5 0 || 5 = 5 说明
本文对各类型并未做详尽的说明,想了解更多资料可以参考以下文章