JavaScript มี 2 ออเปอเรเตอร์เปรียบเทียบ: Loose Equality (==) และ Strict Equality (===) ควรใช้ === (Strict) เป็นหลัก
== (Abstract Equality / Loose Equality)
ทำ Type Coercion (แปลงชนิดข้อมูล) ก่อนเปรียบเทียบ
5 == 5 // true
'5' == 5 // true (string → number)
5 == '5' // true
0 == false // true (false → 0)
'' == false // true ('' → 0, false → 0)
null == undefined // true (special case)
'0' == [] // true ([] → '' → 0)
=== (Strict Equality)
ไม่แปลงชนิดข้อมูล ต้องเป็นชนิดเดียวกันและค่าเท่ากัน
5 === 5 // true
5 === '5' // false (number !== string)
'5' === '5' // true
0 === false // false (number !== boolean)
null === undefined // false
[] === [] // false (reference ต่างกัน)
{} === {} // false (reference ต่างกัน)
ตัวอย่างจากบทความ
// == examples
4 == 4 // true
'4' == 4 // true
4 == '4' // true
0 == false // true
// === examples
4 === 4 // true
4 === '4' // false
var v1 = {'value':'key'};
var v2 = {'value': 'key'};
v1 === v2 // false (object reference ต่างกัน)
ตาราง Type Coercion ของ ==
| A | B | Result | Reason |
|---|---|---|---|
| null | undefined | true | Special rule |
| number | string | string→number | '5' == 5 |
| boolean | any | boolean→number | false==0, true==1 |
| object | primitive | object→primitive | [1] == '1' |
ทำไมควรใช้ ===
- Predictable: ไม่มี surprise type conversion
- Performance: เร็วกว่า (ไม่ต้อง coerce)
- Debugging: ง่ายกว่า ไม่ต้องคิดว่าแปลงชนิดยังไง
- Best Practice: Airbnb, Google, StandardJS style guides แนะนำ ===
กรณีที่ == ยอมรับได้
// ตรวจสอบ null/undefined พร้อมกัน (common pattern)
if (value == null) {
// value คือ null หรือ undefined
}
// เทียบเท่า:
if (value === null || value === undefined) { }
Object.is() (ES6) - Strict ตัวสุด
Object.is(5, 5); // true Object.is(5, '5'); // false Object.is(NaN, NaN); // true (=== ให้ false!) Object.is(0, -0); // false (=== ให้ true!) Object.is(+0, -0); // false
สรุป
Default to === - ใช้ === ทุกครั้ง ยกเว้นกรณีตรวจสอบ null/undefined พร้อมกัน (== null)
ใช้ Object.is() เมื่อต้องแยก NaN, +0/-0