[Easy] 📄 JavaScript Operators
1. What is the difference between == and === ?
==和===有什麼差異?
兩者都是比較運算符號,== 是比較兩個值是否相等,=== 是比較兩個值是否相等且型別也相等。因此後者也可以視為嚴格模式。
其中前者受限於 JavaScript 的設計,會自動轉換類型,導致出現很多不直覺的結果,例如:
1 == '1'; // true
1 == [1]; // true
1 == true; // true
0 == ''; // true
0 == '0'; // true
0 == false; // true
這對開發者來說,是很大的心智負擔,因此普遍建議使用 === 來取代 ==,避免預期外的錯誤。
最佳實踐:永遠使用 === 和 !==,除非你非常清楚為什麼要用 ==。
面試題目
題目 1:基本類型比較
試判斷以下表達式的結果:
1 == '1'; // ?
1 === '1'; // ?
答案:
1 == '1'; // true
1 === '1'; // false
解析:
==(相等運算符):會進行類型轉換- 字串
'1'會被轉換為數字1 - 然後比較
1 == 1,結果為true
- 字串
===(嚴格相等運算符):不進行類型轉換number和string類型不同,直接返回false
類型轉換規則:
// == 的類型轉換優先順序
// 1. 如果有 number,將另一邊轉為 number
'1' == 1; // '1' → 1,結果 true
'2' == 2; // '2' → 2,結果 true
'0' == 0; // '0' → 0,結果 true
// 2. 如果有 boolean,將 boolean 轉為 number
true == 1; // true → 1,結果 true
false == 0; // false → 0,結果 true
'1' == true; // '1' → 1, true → 1,結果 true
// 3. 字串轉數字的陷阱
'' == 0; // '' → 0,結果 true
' ' == 0; // ' ' → 0,結果 true(空白字串轉 為 0)
題目 2:null 和 undefined 的比較
試判斷以下表達式的結果:
undefined == null; // ?
undefined === null; // ?
答案:
undefined == null; // true
undefined === null; // false
解析:
這是 JavaScript 的特殊規則:
undefined == null:true- ES 規範特別規定:
null和undefined用==比較時相等 - 這是唯一一個
==有用的場景:檢查變數是否為null或undefined
- ES 規範特別規定:
undefined === null:false- 它們是不同類型 (
undefined是undefined類型,null是object類型) - 嚴格比較時不相等
- 它們是不同類型 (
實務應用:
// 檢查變數是否為 null 或 undefined
function isNullOrUndefined(value) {
return value == null; // 同時檢查 null 和 undefined
}
isNullOrUndefined(null); // true
isNullOrUndefined(undefined); // true
isNullOrUndefined(0); // false
isNullOrUndefined(''); // false
// 等價於(但更簡潔)
function isNullOrUndefined(value) {
return value === null || value === undefined;
}
注意陷阱:
// null 和 undefined 只與彼此相等
null == undefined; // true
null == 0; // false
null == false; // false
null == ''; // false
undefined == 0; // false
undefined == false; // false
undefined == ''; // false
// 但用 === 時,只與自己相等
null === null; // true
undefined === undefined; // true
null === undefined; // false
題目 3:綜合比較
試判斷以下表達式的結果:
0 == false; // ?
0 === false; // ?
'' == false; // ?
'' === false; // ?
null == false; // ?
undefined == false; // ?
答案:
0 == false; // true(false → 0)
0 === false; // false(類型不同:number vs boolean)
'' == false; // true('' → 0, false → 0)
'' === false; // false(類型不同:string vs boolean)
null == false; // false(null 只等於 null 和 undefined)
undefined == false; // false(undefined 只等於 null 和 undefined)
轉換流程圖:
// 0 == false 的轉換過程
0 == false;
0 == 0; // false 轉為數字 0
true; // 結果
// '' == false 的轉換過程
'' == false;
'' == 0; // false 轉為數字 0
0 == 0; // '' 轉為數字 0
true; // 結果
// null == false 的特殊情況
null == false;
// null 不會轉換!根據規範,null 只等於 null 和 undefined
false; // 結果