首先,来看一段代码:
<!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>
对于 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。