你真的了解JavaScript的"比较运算符(==,!=,===,!===,>=,<=,>,<)"吗?

有下面一段代码,你尝试阅读一下,然后写下你认为的输出。

 

var test1 = '----------==----------\r\n';
test1 += '{}==\'\' \t\t:'			+ ({} == '')			+ '\r\n';	 		
test1 += '{}==0 \t\t:'				+ ({} == 0)				+ '\r\n';
test1 += '{}==null \t\t:'			+ ({} == null)			+ '\r\n';
test1 += '{}==undefined \t:'		+ ({} == undefined)		+ '\r\n';
test1 += '{}==\'\\t\' \t\t:'		+ ({} == '\t')			+ '\r\n';
test1 += '\'\'==0 \t\t:'			+ ('' == 0)				+ '\r\n';
test1 += '\'\'==null \t\t:'			+ ('' == null)			+ '\r\n';
test1 += '\'\'==undefined \t:'		+ ('' == undefined)		+ '\r\n';
test1 += '\'\'==\'\\t\' \t\t:'		+ ('' == '\t')			+ '\r\n';
test1 += '0==null \t\t:'			+ (0 == null)			+ '\r\n';
test1 += '0==undefined \t:'			+ (0 == undefined)		+ '\r\n';
test1 += '0==\'\\t\' \t\t:'			+ (0 == '\t')			+ '\r\n';
test1 += 'null==undefined \t:'		+ (null == undefined)	+ '\r\n';
test1 += 'null==\'\\t\' \t\t:'		+ (null == '\t')		+ '\r\n';
test1 += 'undefined==\'\\t\' \t:'	+ (undefined == '\t')	+ '\r\n';
alert(test1);

var test2 = '---------->=----------\r\n';
test2 += '{}>=\'\' \t\t:'			+ ({} >= '')			+ '\r\n';	 		
test2 += '{}>=0 \t\t:'				+ ({} >= 0)				+ '\r\n';
test2 += '{}>=null \t\t:'			+ ({} >= null)			+ '\r\n';
test2 += '{}>=undefined \t:'		+ ({} >= undefined)		+ '\r\n';
test2 += '{}>=\'\\t\' \t\t:'		+ ({} >= '\t')			+ '\r\n';
test2 += '\'\'>=0 \t\t:'			+ ('' >= 0)				+ '\r\n';
test2 += '\'\'>=null \t\t:'			+ ('' >= null)			+ '\r\n';
test2 += '\'\'>=undefined \t:'		+ ('' >= undefined)		+ '\r\n';
test2 += '\'\'>=\'\\t\' \t\t:'		+ ('' >= '\t')			+ '\r\n';
test2 += '0>=null \t\t:'			+ (0 >= null)			+ '\r\n';
test2 += '0>=undefined \t:'			+ (0 >= undefined)		+ '\r\n';
test2 += '0>=\'\\t\' \t\t:'			+ (0 >= '\t')			+ '\r\n';
test2 += 'null>=undefined \t:'		+ (null >= undefined)	+ '\r\n';
test2 += 'null>=\'\\t\' \t\t:'		+ (null >= '\t')		+ '\r\n';
test2 += 'undefined>=\'\\t\' \t:'	+ (undefined >= '\t')	+ '\r\n';
test2 += '---------->-----------\r\n'
test2 += '{}>\'\' \t\t:'			+ ({} > '')				+ '\r\n';	 		
test2 += '{}>0 \t\t:'				+ ({} > 0)				+ '\r\n';
test2 += '{}>null \t\t:'			+ ({} > null)			+ '\r\n';
test2 += '{}>undefined \t:'			+ ({} > undefined)		+ '\r\n';
test2 += '{}>\'\\t\' \t\t:'			+ ({} > '\t')			+ '\r\n';
test2 += '\'\'>0 \t\t:'				+ ('' > 0)				+ '\r\n';
test2 += '\'\'>null \t\t:'			+ ('' > null)			+ '\r\n';
test2 += '\'\'>undefined \t:'		+ ('' > undefined)		+ '\r\n';
test2 += '\'\'>\'\\t\' \t\t:'		+ ('' > '\t')			+ '\r\n';
test2 += '0>null \t\t:'				+ (0 > null)			+ '\r\n';
test2 += '0>undefined \t:'			+ (0 > undefined)		+ '\r\n';
test2 += '0>\'\\t\' \t\t:'			+ (0 > '\t')			+ '\r\n';
test2 += 'null>undefined \t:'		+ (null > undefined)	+ '\r\n';
test2 += 'null>\'\\t\' \t\t:'		+ (null > '\t')			+ '\r\n';
test2 += 'undefined>\'\\t\' \t:'	+ (undefined > '\t')	+ '\r\n';
alert(test2);

var test3 = '----------<=----------\r\n';
test3 += '{}<=\'\' \t\t:'			+ ({} <= '')			+ '\r\n';	 		
test3 += '{}<=0 \t\t:'				+ ({} <= 0)				+ '\r\n';
test3 += '{}<=null \t\t:'			+ ({} <= null)			+ '\r\n';
test3 += '{}<=undefined \t:'		+ ({} <= undefined)		+ '\r\n';
test3 += '{}<=\'\\t\' \t\t:'		+ ({} <= '\t')			+ '\r\n';
test3 += '\'\'<=0 \t\t:'			+ ('' <= 0)				+ '\r\n';
test3 += '\'\'<=null \t\t:'			+ ('' <= null)			+ '\r\n';
test3 += '\'\'<=undefined \t:'		+ ('' <= undefined)		+ '\r\n';
test3 += '\'\'<=\'\\t\' \t\t:'		+ ('' <= '\t')			+ '\r\n';
test3 += '0<=null \t\t:'			+ (0 <= null)			+ '\r\n';
test3 += '0<=undefined \t:'			+ (0 <= undefined)		+ '\r\n';
test3 += '0<=\'\\t\' \t\t:'			+ (0 <= '\t')			+ '\r\n';
test3 += 'null<=undefined \t:'		+ (null <= undefined)	+ '\r\n';
test3 += 'null<=\'\\t\' \t\t:'		+ (null <= '\t')		+ '\r\n';
test3 += 'undefined<=\'\\t\' \t:'	+ (undefined <= '\t')	+ '\r\n';
test3 += '----------<-----------\r\n'
test3 += '{}<\'\' \t\t:'			+ ({} < '')				+ '\r\n';	 		
test3 += '{}<0 \t\t:'				+ ({} < 0)				+ '\r\n';
test3 += '{}<null \t\t:'			+ ({} < null)			+ '\r\n';
test3 += '{}<undefined \t:'			+ ({} < undefined)		+ '\r\n';
test3 += '{}<\'\\t\' \t\t:'			+ ({} < '\t')			+ '\r\n';
test3 += '\'\'<0 \t\t:'				+ ('' < 0)				+ '\r\n';
test3 += '\'\'<null \t\t:'			+ ('' < null)			+ '\r\n';
test3 += '\'\'<undefined \t:'		+ ('' < undefined)		+ '\r\n';
test3 += '\'\'<\'\\t\' \t\t:'		+ ('' < '\t')			+ '\r\n';
test3 += '0<null \t\t:'				+ (0 < null)			+ '\r\n';
test3 += '0<undefined \t:'			+ (0 < undefined)		+ '\r\n';
test3 += '0<\'\\t\' \t\t:'			+ (0 < '\t')			+ '\r\n';
test3 += 'null<undefined \t:'		+ (null < undefined)	+ '\r\n';
test3 += 'null<\'\\t\' \t\t:'		+ (null < '\t')			+ '\r\n';
test3 += 'undefined<\'\\t\' \t:'	+ (undefined < '\t')	+ '\r\n';
alert(test3);

 

我们看一下运行的结果。

这里的三个true的有点让人摸不着头脑,另外,还有0=='\r\n'也是为true的。

也许你会讲,用绝对判断(===,!==)就可以了,没错,在判断是否相等的情况下,绝对判断是可以的,但下面的结果会更让你吃惊。

这里面需要动动脑筋思考一下的,有些是正确的,但结合上面的等价判断有些确实让人莫名其妙。

比如说:

1.

''==null 是 false

''>null 和 ''<null也是false

可是''>=null 和''<=null居然是true,完全不符合逻辑。

2.

0和null 的对比和上面是一样的情况

3.

null==undefined是true

可是null>=undefined及null<=undefined居然都是false

4.

null和'\t'的对比和1,2是一样的情况

 

可见>=和<=的逻辑和我们对其它语言的理解不一样,具体原因本人尚不清楚。


posted @ 2010-12-15 23:52  Amo.Xu  阅读(325)  评论(0编辑  收藏  举报