首先,来看一段代码:
<!DOCTYPE html>
<html>
<head>
<title>contextMenu Event Example</title>
<script type="text/javascript">
window.onload = function(){
var undefined;
alert(undefined == null);
// true
alert(2 == true);
// true
2 == true;
// false
0 == false;
// true
0 == '';
// true
NaN == NaN;
// false
[] == false;
// true
[] == ![];
// true
}
</script>
</head>
<body>
</body>
</html>
执行类型转换的规则如下:
如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。
在比较时,该运算符还遵守下列规则:
值 null 和 undefined 相等。
在检查相等性时,不能把 null 和 undefined 转换成其他值。
如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。
对于 NaN==NaN,结果为false的情况,解释如下:
NaN是一个值类型,同是也是一个数值.意思是Not A Number,这个都知道是什么意思.值比较特殊,特殊在于NaN是一个数字,是一个与任何数值都不相等的数字. javascript:alert(typeof(NaN));可以完全证实,这是一个数字类型的值.也就是说NaN是当时转换时一种出错的策略,转成一个谁也不认识的数字而已.从这个角度上理解它是一个数字,可以理解成数学中的无穷大或是无穷小.但与数学中一个理论是相悖的,我们常说,无穷大加1等于无穷大是错误的.正是无空大加1不等于无穷大,所以无穷大也不等于它自己本身.所以数值NaN连自身都不会相等的. 而在javascript中NaN既然作为一个无穷大,那么它表示的就不再是一个值,而是一类值,所以有时可视NaN是一个类型. 正是这样的边缘问题,可以导致: 唯一的是NaN是一个不确定数,所以NaN不能等于NaN. 这好比是randomise中的random,random +1 还是一个不确定的数值,但random不会等于random一样.两者的区别在于random能生成一个确定数,但本身不确定.而NaN生成的就是一个不确定数.
对于[]==[]结果为false,可以理解为:
两个运算符都是对象,那么比较的就是他们的引用值。而第一个[]和第二个[]都没有明确的指向同一个对象,因此结果为false。同理:[]!=[],结果为true。