相等運算符

如果操作數具有相同的類型,則判斷其等同性,如果兩個操作數的值相等,則返回true(相等),否則返回false(不相等).

如果操作數的類型不同,則按照這樣的情況來判斷:

◆ null和undefined相等

◆ 其中一個是數字,另一個是字符串,則將字符串轉換為數字,在做比較

◆ 其中一個是true,先轉換成1(false則轉換為0)在做比較

◆ 如果一個值是對象,另一個是數字/字符串,則將對象轉換為原始值(通過toString()或者valueOf()方法)

◆ 其他情況,則直接返回false

等同運算符

如果操作數的類型不同,則不進行值的判斷,直接返回false

如果操作數的類型相同,分下列情況來判斷:

◆ 都是數字的情況,如果值相同,則兩者等同(有一個例外,就是NaN,NaN與其本身也不相等),否則不等同

◆ 都是字符串的情況,與其他程序設計語言一樣,如果串的值不等,則不等同,否則等同

◆ 都是布爾值,且值均為true/false,則等同,否則不等同

◆ 如果兩個操作數引用同一個對象(數組,函數),則兩者完全等同,否則不等同

◆ 如果兩個操作數均為null/undefined,則等同,否則不等同

比如:

    <strong>var obj = {  
        id : "self",  
        name : "object" 
    };  

    var oa = obj;  
    var ob = obj;  

    print(oa == ob);  
    print(oa === ob);</strong> 

會返回:

true

true

再來看一個對象的例子:

    <strong>var obj1 = {  
        id : "self",  
        name : "object",  
        toString : function(){  
           return "object 1";  
        }  
    }  

    var obj2 = "object 1";  

    print(obj1 == obj2);  
    print(obj1 === obj2);</strong>



返回值為:

true

false

obj1是一個對象,而obj2是一個結構與之完全不同的字符串,而如果用相等操作符來判斷,則兩者是完全相同的,因為obj1重載了頂層對象的toString()方法。

而!=不等和!==不等同,則與==/!==相反。因此,在JavaScript中,使用相等/等同,不等/不等同的時候,一定要注意類型的轉換,這裏推薦使用等同/不等同來進行判斷,這樣可以避免一些難以調試的bug。