JavaScript数据类型中易被忽略的点(2)

 

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…|

true/false   no conversion  
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 说明

本文对各类型并未做详尽的说明,想了解更多资料可以参考以下文章

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/68a7845d758e6af302bece55f22fb70d.html