今天面試回來,像往常同樣打開手機,看到QQ羣上有個加羣申請,進羣得回答問題:true == '0'
,看到有個申請的答案爲false,而後我就自信的點了拒絕。閒着無聊,打開電腦在控制檯上輸入題目,結果爲false,我就很好奇爲何是這樣呢?明明兩邊的值都會爲true啊,爲何會錯呢(被拒絕的童鞋不要怪我)。帶這個這個疑問我翻了下你不知道的javascriptjavascript
javascript中的值分爲兩類:java
咱們知道能轉換爲false的基本類型有,咱們稱其爲假值:面試
那麼,上面的值既然能夠轉化爲false,咱們的true == '0'
兩邊均可以轉化爲true,那麼爲何不相等呢?spa
咱們先來講下寬鬆相等「==」和「===」。在以往的理解中,個人理解一直是:「==」表示兩個值相等,「===」表死兩個值和類型相等。可是書中說,它們的理解應該說是這樣:「==容許在相等比較中進行強制類型轉化,===不容許」,仍是不太理解,兩種理解有什麼區別嗎?暫時放一放,咱們日後看。。。code
下面摘抄一段樹上寫的區別:ip
根絕第一種解釋,===彷佛比==作的事情更多,由於它還要檢查值的類型,第二種解釋中==的工做量更大一些,由於若是值的類型相同海須要進行強制類型轉化。字符串
若是兩個值的類型不一樣,咱們就須要考慮有沒有強制類型轉化的必要,有就用==,不然用===string
接下來咱們來看幾種比較來加深理解it
var a = 4;
var b = "4";
a == b //true
a === b //false
複製代碼
這個結果你們應該都知道,可是 == 比較時,是將兩邊的值所有轉化爲數字呢仍是轉化爲字符串比較呢?未完待續。。。(皮一下:smile:)class
哈哈,開個玩笑,公佈答案:轉化爲數字。依據就是:
ES5規範11.9.3.4-5這樣定義(ToNumber強制轉化爲數字)
(1)若是Type(x)是數字,Type(y)是字符串,則返回x == ToNumber(y)的結果
(2)若是Type(x)是字符串,Type(y)是數字,則返回ToNumber == y的結果
我以爲這一塊咱們理解的誤區比較多,也是出錯最多的一塊。
例如:
var a = true;
var b = 4;
a == b //false
複製代碼
以往咱們的理解是:數字4是一個真值(與假值對應),會轉化爲true,從而兩邊相等。哪裏錯了呢?咱們直接來看ES標準
ES5規範11.9.3.6-7這樣定義(ToNumber強制轉化爲數字)
(1)若是Type(x)是布爾值,則返回ToNumber(x) == y的結果
(2)若是Type(y)是布爾值,則返回x == ToNumber(y)的結果
原來比較的時候是將布爾值轉化爲數字,即:
var a = true;
var b = 4;
var c = true;
var d = "12";
a == b ===> 1 == 4 //false
c == d ===> 1 == "12" ===> 1 == 12 //false
複製代碼
這樣是否是清楚多了,因此咱們判斷的時候別用( a == true)這種判斷。注意:若是x,y中存在 null或undefiend,則參考第三點
ES5規範11.9.3.2-3這樣定義
(1)若是x爲null,y爲undefined,則返回true
(2)若是x爲undefined,y爲null,則返回true
在 == 中,null和undefined相等,除此以外不存在這種狀況
var a = null;
var b;
a == b //true
a == false //false
b == false //false
a == 0 //false
b == 0 //false
a == "" //false
b == "" //false
複製代碼
今天就寫到這裏,第一次寫文章,若有什麼不對的地方,還望你們指正