大家都知道 == 是不區分類型是否相同,只要結果一致即可,而 === 則是連類型也必須相同才行。
比如 "1" == 1 是 true, 而 "1" === 1 是 false ,這個理所當然都知道的。
但很少有人用 === 因為很多新手對 js 不熟,為了保證不出錯所以全用 ==
或者是因為 == 方便,不必考慮結果類型,等等,反正 == 比 === 方便,而且不容易出錯。
確實 == 比較方便而且兼容性好,但是他的性能問題也不容小噓的。
翻閱 V8 源碼(查看 == 源碼, 查看 === 源碼)可以很明顯發現 == 源碼里各種比較各種轉換。
而 === 源碼里只對 字符串 和 數字 進行了比較,如果不是 字符串 和 數字 則直接比較是否為同一引用。
上面 V8 源碼對應的 ECMA-262 章節詳細描述了 == 與 === 的判定方法:
ECMA-262 Section 11.9.3, ECMA-262 Section 11.9.4, ( === 的算法部分在 ECMA-262 Section 11.9.6 )
雖然我英文不太好,但是勉強看到 == 各種判斷和轉換,而 === 則明顯少很多。
不說那些條條框框的,我們用例子來測試下吧。
var obj1 = {toString: function(){ return 1}}; var obj2 = {toString: function(){ return '1'}}; 1 == 1; // true '1' == 1; // true obj1 == 1; // true obj2 == 1; // true 1 === 1; // true '1' === 1; // false obj1 === 1; // false obj2 === 1; // false
應該沒有問題吧,非常簡單的例子。不出意外,你可以看到這個結果。
那么對他們分別進行 100 萬運算,看看耗時會是多少呢。
var obj1 = {toString: function(){ return 1}}; var obj2 = {toString: function(){ return '1'}}; console.time('=='); for (var i=0; i<1e6; i++) { 1 == 1; '1' == 1; obj1 == 1; obj2 == 1; } console.timeEnd('=='); console.time('==='); for (var i=0; i<1e6; i++) { 1 === 1; '1' === 1; obj1 === 1; obj2 === 1; } console.timeEnd('===');
我在chrome firefox IE11 下進行了測試,得到如下結果:
PS: 測試結果根據電腦性能而定,說不定你的神機比我快N倍也不一定哦。
這個結果很不可思議吧,
== 最快的是 IE11 其次是 chrome 最后是 firefox
=== 最快的是 firefox 其次是 chrome 最后是 IE11
(我最愛的 chrome 竟然表現平平,真讓我失望啊)
好了,我們已經知道 === 比 == 快 N 倍了,那我以后把 == 全改成 == 就好了。
那樣也不行,因為有時候確實 == 比 === 方便。
那么什么情況下用 === 呢? 我覺得下面幾種情況盡量用 ===
1. 能確定 類型 的情況下
2. 比較大的循環里
3. 等你來補充...
因為一兩次或者幾十次的 == 完全不影響性能,但是循環里如果上千上萬的 == 就會影響了。
== 和 === 的存在必然他們存在的價值和意義,所以善用才是王道。