一、爲何討論這個問題?javascript
- 有個說法,儘可能不用==,而使用===,是這樣嗎?html
二、分析問題,原理是什麼?java
下面說說ECMAScript 5 language specification裏的說明:spa
1)兩種比較方法htm
全等號===只考慮類型相同的值的比較,不一樣類型使用===進行比較,返回false對象
雙等號==會先將不一樣類型的值轉爲相同類型,而後使用全等號進行比較。ip
使用雙等號會有兩個問題:ci
● 轉換規則可能不是你指望的那樣string
● 因爲雙等號是寬容的,類型錯誤可能會被忽略掉。it
2)全等號===(嚴格等號)
比較兩個值,
若是類型不一樣,必定返回false;
若是類型相同,則按照以下的規則進行比較:
① 兩個都是undefined類型,返回true;(undefined === undefined)
② 兩個都是null類型,返回true;(null === null)
③ 兩個都是number類型
若是有一個是NaN,則爲false;(Nan !== *//any value including NaN)
若是兩個值相同,返回true;(x==x)
一個是+0,一個是-0(+0===-0)
④ 兩個都是boolean類型或者兩個都是string類型(基礎數據類型,不是String對象),答案很明顯。
"111" === "111"//true
true === true//true
⑤ 兩個對象(包括array和function),除非是同一個對象(即同一個引用),不然都是false
var a = NaN;
a === a;//false(NaN沒法用來比較)
var b = {}, c = {};
b === c;//false
b === b;//true
"abc" = new String("abc");//false(左邊是基本數據類型string,後邊是object類型)
注:ECMAScript中有5種基本數據類型(Undefined、Null、Boolean、Number、String)
還有1種複雜數據類型Object。
3)雙等號==
比較兩個值,若是兩個值類型相同,則使用===進行對比;
若是兩個值類型不一樣,則按照一下規則進行比較:
① undefined == null
② 一個number,一個string,將string轉換成number類型再作比較;
③ 一個boolean,一個非boolean,將boolean轉換成number類型再作比較;
④ 一個string或者number,跟一個object,將object轉換成基本數據類型再作比較;
第三條規則會致使大於1的number值不等於true,好比:
0 == false//true
1 == true//true
2 == true//false(true -- > 1 ; 2 != 1)
2 ? true : false//true
"" == 0;//true
"123" == 123;//true
"" == false//true(false-->0;""-->0;0==0)
"1" == true//true
"2" == true//false(true-->1;"2"-->2;2!=1)
"true" == true//false(true-->1;"true"-->NaN;1!=NaN)
"2" ? true : false//true(because string is non-empty)
"abc" == new String("abc")//true(object->string)
三、得出結論和建議?
鑑於==的對比規則會出現一些意想不到的結果,建議儘可能多使用===,而非==。
參考文章:
http://www.2ality.com/2011/06/javascript-equality.html
https://www.zhihu.com/question/31442029