之前有一篇文章解剖JavaScript中的null和undefined   把javascript中的null运算符和undefined 作了详细的剖析。现在把Javascript中的==运算做一下剖析。

先从一个小例子着手:

  1. var a=[];  
  2. if(a && (a==false) ){  
  3.      alert(true);  
  4. }else{  
  5.      alert(false);  
  6. }

首先,这个会弹出true

这里有四个知识点。一是关于==运算符的运行方式。

一、等性运算符为确定两个运算数是否相等,会(对两边的运算数)进行类型转换

执行转换的基本规则如下:

  • 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
  • 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
  • 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
  • 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

在比较时,该运算符还遵守下列规则:

  • 值 null 和 undefined 相等。
  • 在检查相等性时,不能把 null 和 undefined 转换成其他值。
  • 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
  • 如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

重要提示即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。

在运行a==false这个等式的时候,会先隐式的会先运算Number(a).这会牵扯出第二个知识点Number()强制转换。

表达式
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

二、Number()强制转换

  1. Number("") => 0
  2. Number(" ") => 0
  3. Number("         ") => 0
  4. Number("\n") => 0
  5. Number([]) => 0
  6. var a={};
  7. Number(a) => NaN //"[object Object]"
  8. a.toString=function(){ return ""}
  9. Number(a) => 0

三、&&运算符

逻辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值。

如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值:

  • 如果一个运算数是对象,另一个是 Boolean 值,返回该对象。
  • 如果两个运算数都是对象,返回第二个对象。
  • 如果某个运算数是 null,返回 null。
  • 如果某个运算数是 NaN,返回 NaN。
  • 如果某个运算数是 undefined,发生错误。

、Boolean() 强制转换

当要转换的值是至少有一个字符的字符串、非 0 数字或对象时,Boolean() 函数将返回 true。如果该值是空字符串、数字 0、undefined 或 null,它将返回 false。

可以用下面的代码测试 Boolean 型的强制类型转换:

  • var b1 = Boolean(""); //false - 空字符串
  • var b2 = Boolean("hello"); //true - 非空字符串
  • var b1 = Boolean(50); //true - 非零数字
  • var b1 = Boolean(null); //false - null
  • var b1 = Boolean(0); //false - 零
  • var b1 = Boolean(new object()); //true - 对象

在这里 a是一个数组,也就是一个对象,所以,返回true

经过在blueidea里面的一番激烈辩论,总算弄清楚了,这里面的过程为:

a&&(a==false) 转换为Boolean(a)&&(a==false)转换true&&(a==false)转换为a==false转换为Number(a)==0,转换为0==0,结果true