ใน JavaScript มี 4 วิธีเปรียบเทียบความเท่ากัน บทความนี้อธิบาย operators แบบต่างๆ, type coercion, และกรณีพิเศษ (edge cases) ที่พบในสัมภาษณ์งาน
1. Strict Equality (===)
เปรียบเทียบ ทั้งค่าและ type
const strictComparison = (a, b) => {
console.log(typeof a); // 'number'
console.log(typeof b); // 'string'
return a === b;
};
strictComparison(8, '8'); // false
กรณีพิเศษกับ ===
| Operand1 | typeof | Operand2 | typeof | Result |
| null | object | null | object | true |
| undefined | undefined | undefined | undefined | true |
| null | object | undefined | undefined | false |
| NaN | number | NaN | number | false |
| false | boolean | "false" | string | false |
| false | boolean | false | boolean | true |
| "" | string | "" | string | true |
| "" | string | undefined | undefined | false |
NaN === NaN เป็น false เพราะ NaN อาจเป็นค่าอะไรก็ได้ ไม่มีการบ่งชี้ว่าเท่ากัน
ไม่เปรียบเทียบ data structures (arrays, objects) ได้ด้วย ===
2. Strict Inequality (!==)
ตรวจสอบว่า ไม่เท่ากันทั้งค่าและ type
const strictInequalityComparison = (a, b) => a !== b;
strictInequalityComparison("8", 8); // true (type ต่างกัน)
กรณีพิเศษกับ !==
| Operand1 | typeof | Operand2 | typeof | Result |
| null | object | null | object | false |
| undefined | undefined | undefined | undefined | false |
| null | object | undefined | undefined | true |
| NaN | number | NaN | number | true |
| false | boolean | "false" | string | true |
| false | boolean | false | boolean | false |
| "" | string | "" | string | false |
| "" | string | undefined | undefined | true |
3. Loose Equality (==)
ทำ Type Coercion (แปลง type ให้เหมือนกัน) ก่อนเปรียบเทียบค่า
const looseComparison = (a, b) => a == b; looseComparison(8, '8'); // true (string '8' ถูกแปลงเป็น number)
กรณีพิเศษกับ ==
| Operand1 | typeof | Operand2 | typeof | Result |
| null | object | null | object | true |
| undefined | undefined | undefined | undefined | true |
| null | object | undefined | undefined | true |
| NaN | number | NaN | number | false |
| false | boolean | "false" | string | false |
| false | boolean | false | boolean | true |
| "" | string | "" | string | true |
| "" | string | undefined | undefined | false |
จุดสำคัญ: null == undefined เป็น true (ต่างจาก strict equality)
4. Loose Inequality (!=)
ตรวจสอบ ไม่เท่ากันแค่ค่า (coerce type ก่อน)
const looseInequalityComparison = (a, b) => a != b;
looseInequalityComparison("8", 8); // false (ค่าเท่ากันหลัง coerce)
กรณีพิเศษกับ !=
| Operand1 | typeof | Operand2 | typeof | Result |
| null | object | null | object | false |
| undefined | undefined | undefined | undefined | false |
| null | object | undefined | undefined | false |
| NaN | number | NaN | number | true |
| false | boolean | "false" | string | true |
| false | boolean | false | boolean | false |
| "" | string | "" | string | false |
| "" | string | undefined | undefined | true |
null != undefined เป็น false (ต่างจาก strict inequality)
สรุป
จำหลัก: === และ !== ตรวจสอบทั้ง type และค่า (แนะนำใช้ส่วนใหญ่) == และ != ทำ type coercion ก่อนเปรียบเทียบค่า null == undefined เป็น true แตกต่างจาก strict