淺談 == 與 === 的性能問題


大家都知道 == 是不區分類型是否相同,只要結果一致即可,而 === 則是連類型也必須相同才行。
比如  "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. 等你來補充...

因為一兩次或者幾十次的 == 完全不影響性能,但是循環里如果上千上萬的 == 就會影響了。
== 和 === 的存在必然他們存在的價值和意義,所以善用才是王道。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM