2011-09-12 99 views
6

我剛纔一直在看Underscore.js的_.isEqual功能和代碼的部分是這樣的:Underscore.js這行是否需要進行相等性檢查?

if (a === b) return true; 

if (typeof a !== typeof b) return false; 

if (a == b) return true; 

我只是想知道,如果有其中第三條語句可以達成任何情況下,並評估爲true

編輯:只是要清楚,這不是我自己的代碼,我說的是,我讀下劃線的來源,特別是this line和我很好奇他們爲什麼這樣做。

+1

有一些奇怪的邊緣情況下,這是可能的... –

+0

@nickf:考慮到當類型相同時'=='和'==='是相同的,我看不出第一次和第三次測試會提供不同的結果。即使在'null'的情況下,'typeof'與內部的'Type'不同,它不強制爲除'undefined'之外的任何值,它具有不同的'typeof'值。如果那裏有*邊緣案例,你怎麼知道你會希望它強制?對相同的值進行'=='和'==='測試似乎很奇怪。要麼你想要類型強制,要麼你不需要。 – user113716

+0

......我應該在上面的評論中通過*「you」*來闡明,我並不是想暗示* nickf *,而是*一個人*。 – user113716

回答

3

我剛纔瀏覽了Underscore回購,發現有人問the exact same thing這個簡短的討論,看起來實際上沒有必要。

遵循由ECMAScript語言規範在section 11.9.6section 11.9.3中定義的算法似乎表明在上述情況下沒有一對值應該返回true。因此,總之,不,那種情況是不可能的

+0

+1在這個討論中找到好的 – user113716

1

唯一情況=====出乎意料反應是一個文本字符串("123")相對於一個構造的字符串(new String("123")),其將失敗第一測試時。

但是,在第二個測試中,它被捕獲,因爲構造的字符串類型爲object,但文字類型爲string

基於此,我會說不,第三個陳述永遠不可能達成,並評估爲真。

1

當您使用==運算符並且表達式具有不同類型時,JavaScript在比較之前通常會將兩者轉換爲相同類型。

例如,這可能發生在nullundefinednull == undefined是真的,儘管null === undefined是錯誤的。然而typeof null"object",而typeof undefined"undefined"。所以,在這種情況下,您應該在第二條語句中返回false。

您可以閱讀該規範(第11.9.3)的所有細節,這是非常投入: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf