之前有一篇文章解剖JavaScript中的null和undefined 把javascript中的null运算符和undefined 作了详细的剖析。现在把Javascript中的==运算做一下剖析。
先从一个小例子着手:
- var a=[];
- if(a && (a==false) ){
- alert(true);
- }else{
- alert(false);
- }
首先,这个会弹出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()强制转换
- Number("") => 0
- Number(" ") => 0
- Number(" ") => 0
- Number("\n") => 0
- Number([]) => 0
- var a={};
- Number(a) => NaN //"[object Object]"
- a.toString=function(){ return ""}
- 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
