== (Loose Equality / Abstract Equality) vs === (Strict Equality)
JavaScript มีตัวเปรียบเทียบความเท่ากัน 2 แบบ ที่ทำงานต่างกันอย่างสิ้นเชิง
== (Double Equals) - Loose Equality
- ทำ Type Coercion (การแปลงชนิดข้อมูลอัตโนมัติ) ก่อนเปรียบเทียบ
- แปลง Operand ให้เป็นชนิดเดียวกัน แล้วค่อยเปรียบเทียบค่า
- ซับซ้อนและสร้าง Bug ได้ง่าย ไม่แนะนำให้ใช้
ตัวอย่าง ==
4 == 4 // true
'4' == 4 // true (String '4' → Number 4)
4 == '4' // true
0 == false // true (false → 0)
'' == false // true ('' → 0, false → 0)
null == undefined // true (Special Rule)
'0' == [] // true ([] → '' → 0, '0' → 0)
[] == ![] // true (WTF JavaScript!)
=== (Triple Equals) - Strict Equality
- ไม่ทำ Type Coercion เปรียบเทียบ ทั้งชนิดข้อมูล (Type) และค่า (Value)
- คืนค่า true ก็ต่อเมื่อ Type และ Value เท่ากันทุกประการ
- พฤติกรรมที่คาดเดาได้ แนะนำให้ใช้เสมอ
ตัวอย่าง ===
4 === 4 // true
4 === '4' // false (Number !== String)
'4' === '4' // true
0 === false // false (Number !== Boolean)
null === undefined // false
[] === [] // false (Object Reference ต่างกัน)
{} === {} // false
ตารางเปรียบเทียบความแตกต่าง
| Expression | == (Loose) | === (Strict) |
|---|---|---|
| 1 == '1' | true | false |
| 0 == false | true | false |
| '' == false | true | false |
| null == undefined | true | false |
| NaN == NaN | false | false |
| [] == '' | true | false |
| [] == 0 | true | false |
| [1] == '1' | true | false |