關系表達式
==和===都是JavaScript中的關系表達式運算符,與對應的還有!=和!==。
==和===運算符主要用于比較兩個值是否相等。當然它們對相等的定義不盡相同。兩個運算符允許任意類型的操作數,如果操作數相等則返回true,否則返回false。
==和===定義
==和===雖然都是關系表達式運算符,但它們的定義是有所不同的:
==:稱作相等運算符(Equality Operator),它用來檢測兩個操作是否相等,這里的相等的定義非常寬松,可以允許類型的轉換
===:稱作嚴格相等運算符(Strict Equality),也被稱之為恒等運算符(Identity Operator)或全等運算符,它用來檢測兩個操作數是否嚴格相等
== 和 ===運算規則
JavaScript中==和===運算符,它們的運算都具有自己的運算規則。
==運算規則
==運算符對于兩個數比較并不嚴格。如果兩個操作數不是同一類型,那么相等運算符會嘗試進行一些類型轉換,然后進行比較。
在轉換不同的數據類型時,其會遵循下列基本原則:
如果兩個操作數的類型相同,則會按照嚴格相等的比較規則一樣,如果嚴格相等,那么比較結果為相等。如果它們不嚴格相等,則比較結果為不相等。
如果兩個操作數的類型不同,==相等操作符也可能會認為它們相等。檢測相等將會遵守下面的規則和類型轉換:
如果一個值是null, 另一個是undefined,則它們是相等:
null == undefined; // => true
如果一個值是數字,另一個是字符串,先將字符串轉換為數值,然后使用轉換后的值進行比較:
1 == '1'; // => true
如果其中一個值是true,則將其轉換為1再進行比較。如果其中一個值是false,則將其轉換為0再進行比較:
true == 0; // => false
false == 1; // => false
true == 1; // => true
false == 0; // => true
true == '1'; // => true
false == '0';// => true
如果一個值是對象,另一個值是數字或字符串,將會先使用toString()和valueOf()將對象轉換為原始值,然后再進行比較。
兩個操作數在進行比較時則要遵循下列規則:
null和undefined是相等的
要比較相等性之前,不能將null和undefined轉換成其他任何值
如果有一個操作是NaN,則相等操作符返回false,而不相等操作符返回true。重要提示: 即使兩個操作數都是NaN,相等操作符也返回false,因為按照規則 ,NaN不等于NaN
如果兩個操作數都是對象,則比較它們是不是同一個對象。如果兩個操作數都指向同一個對象,則相等操作符返回true,否則返回false
來看一下對象的比較:
var a = [1,2,3];
var b = [1,2,3];
var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };
var e = "text";
var f = "te" + "xt";
a == b // =>false
c == d // =>false
e == f // =>true
對于兩個操作數var1==var2,下圖能表達的很清楚:
圖中綠色的方框表示返回的值為true,其它的表示返回的值為false。同樣可以使用另一張圖來表述:
圖中橙色的方框表示返回的值為true,其它的表示返回的值為false。
===運算規則
嚴格相等運算符===首先要計算其操作數的值,然后比較這兩個值,比較過程沒有任何類型轉換。其運算規則遵循下面的規則:
如果兩個值類型不相同,則它們不相等
true === '1'; // => false
其中操作數true是布爾值,而'1'是字符串值。
如果兩個者都是null或者都是undefined,則它們相等:
null === null; // => true
undefined === undefined; // => true
null === undefined; // =>false
如果兩個值都是布爾值true或false,則它們相等:
true === true; // =>true
false === false; // =>true
true === 1; // =>false
true === '1'; // =>false
false === 0; // =>false
false === '0'; // =>false
如果其中一個值是NaN,或者兩個值都是NaN,則它們不相等。NaN和其他任何值都是不相等的,包括它本身。通過x !== x來判斷x是否為NaN,只有在x為NaN的時候,這個表達式的值才為true。
如果兩個值為數字且數值相等,則它們相等。如果一個值為0,另一個值為-0,則它們同樣的相等。
如果兩個值為字符串,且所含的對應位上的16位數完全相等,則它們相等。如果它們的長度或內容不同,則它們不等。兩個字符串可能含義完全一樣且所顯示出的字符也一樣,但且有不同編碼的16位值。JavaScript并不對Unicode進行標準化的轉換,因此像這樣的字符串通過===和==運算符的比較結果也不相等。在JavaScript中字符串的比較提供了一個String.localeCompare()方法。
如果兩個引用值指向同一個對象,數組或函數,則它們是相等的。如果指向不同的對象,則它們是不等的,盡管兩個對象具有完全一樣的屬性。
var a = [1,2,3];
var b = [1,2,3];
var c = a;
var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true
var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;
var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true
var a = { };
var b = { };
var c = a;
var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true
同樣對于var1 === var2也可以用圖來表達:
上圖中綠色的方框表示返回的值為true,白色的方框表示返回的值為false。除了上圖之外,下面這張圖也表達的是同樣的意思:
上圖中橙色的方框表示返回的值為true,白色的方框表示返回的值為false。
在JavaScript中比較運算符不僅僅是==和===。還有其它的比較運算符,比如<=、>=。綜合起來,也可以使用一張圖表述:
紅色:===
橙色:==
黃色:<=和>=同時成立,==不成立
藍色:只有>=
綠色:只有<=
!= 和 !==
在JavaScript中還有兩個運算符和==、===類似,它們是!=和!===。在JavaScript中,!=和!==運算符的檢測是==和===運算符的求反。如果兩個值通過==的比較結果為true,那么通過!=的比較結果則為false。如果兩個值通過===的比較結果為true,那么通過!==的比較結果則為false。
總結
這篇文章簡單的總結了JavaScript中的==和===運算符的規則,以前這兩個運算符中不同之處。簡單的只需要記住==表示兩個操作數相同,===表示來格相等(恒等或全等),!=稱為不相等,!==表示不嚴格相等。