2011-03-27 51 views
10

我一直在嘗試理解JavaScript比較運算符之間的區別:身份和平等。從我讀過的內容來看,如果您使用==檢查兩個對象的相等性,JavaScript將嘗試確定它們是否是相同類型,如果不是,則嘗試將它們轉換爲相同類型。但是,===的行爲不一樣。因此,作爲一個例子:JavaScript比較運算符:身份與平等

var n = "1"; 
console.log(n==1);  // outputs true 
console.log(n===1);  // outputs false 

那麼究竟是什麼,這些「身份」運營商和正規平等運營商之間的區別?兩者有什麼好處?

性能有差異嗎?我認爲身份運營商會更快,因爲它不做轉換。

另外,當涉及更復雜的對象,如數組時,它們又有何不同?最重要的是,什麼時候約定會說什麼時候應該使用另一個,爲什麼?

+1

這裏我提供了一個在JavaScript中equal操作符的真值表http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter-which-equal-operator-i-use/ 7446163#7446163 – CuongHuyTo 2011-09-16 14:30:19

回答

18

等於運算符將試圖使數據類型在進行比較之前相同。另一方面,身份運算符要求兩種數據類型都與先決條件相同。

還有不少其他類似的問題。請參閱:

How do the PHP equality (== double equals) and identity (=== triple equals) comparison operators differ?(有一個很好的對比圖)
Which equals operator (== vs ===) should be used in JavaScript comparisons?

在實踐中,操作者的身份進來非常方便,當你想肯定的是一個布爾值是真還是假,因爲...

1 == true  => true 
true == true => true 
1 === true => false 
true === true => true 
13

區別在於,==,< =,> =和!=會執行類型強制—例如,強制字符串被評估爲數字。 ===,< ==,> ==和!==不會執行類型強制。他們會將一個字符串與一個數字進行比較,並且由於字符串「1」與數字值1不同,結果爲false。

參考這裏:
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Comparison_Operators

+0

明白了......所以它就像我上面概述的那樣簡單。身份運算符不會檢查類型,但是相等運算符會執行此操作。 – Hristo 2011-03-27 03:46:11

+2

至於何時使用哪一個; [Douglas Crockford](http://javascript.crockford.com/code.html):*使用===和!==運算符幾乎總是更好。 ==和!=運算符會輸入強制類型。特別是,不要使用==與falsy值進行比較。* – 2011-03-27 03:49:10

+0

@Joel ...真棒鏈接!謝謝!但是,它沒有列出<== and > ==。那些合法嗎? – Hristo 2011-03-27 03:49:46

5

==是同樣的事情===,除了==並類型轉換

要告訴你我的意思在這裏是表現完全相似的JavaScript函數==

// loseEqual() behaves just like `==` 
function loseEqual(x, y) { 
    // notice the function only uses "strict" operators 
    // like `===` and `!==` to do comparisons 

    if(typeof y === typeof x) return y === x; 

    if(typeof y === "function" || typeof x === "function") return false; 

    // treat null and undefined the same 
    var xIsNothing = (y === undefined) || (y === null); 
    var yIsNothing = (x === undefined) || (x === null); 

    if(xIsNothing || yIsNothing) return (xIsNothing && yIsNothing); 

    if(typeof x === "object") x = toPrimitive(x); 
    if(typeof y === "object") y = toPrimitive(y); 

    if(typeof y === typeof x) return y === x; 

    // convert x and y into numbers if they are not already use the "+" trick 
    if(typeof x !== "number") x = +x; 
    if(typeof y !== "number") y = +y; 

    return x === y; 
} 

function toPrimitive(obj) { 
    var value = obj.valueOf(); 
    if(obj !== value) return value; 
    return obj.toString(); 
} 

此功能應該有助於解釋爲什麼人們不斷說你不應該使用==

正如你所看到的==有很多複雜的類型轉換邏輯。因爲這很難預測你會得到什麼結果 - 這可能會導致錯誤。

這裏有一些成果的一些例子,你不會想到:

意外的真相

[1] == true // returns true 
'0' == false // returns true 
[] == false // returns true 
[[]] == false // returns true 
[0] == false // returns true 

'\r\n\t' == 0 // returns true 

意外的結論:

// IF an empty string '' is equal to the number zero (0) 
'' == 0 // return true 

// AND the string zero '0' is equal to the number zero (0) 
'0' == 0 // return true 

// THEN an empty string must be equal to the string zero '0' 
'' == '0' // returns **FALSE** 

對象具有特殊功能的

// Below are examples of objects that 
// implement `valueOf()` and `toString()` 

var objTest = { 
    toString: function() { 
     return "test"; 
    } 
}; 

var obj100 = { 
    valueOf: function() { 
     return 100; 
    } 
}; 

var objTest100 = { 
    toString: function() { 
     return "test"; 
    }, 
    valueOf: function() { 
     return 100; 
    } 
}; 

objTest == "test" // returns true 
obj100 == 100 // returns true 
objTest100 == 100 // returns true 

objTest100 == "test" // returns **FALSE**