ข้ามไปยังเนื้อหา

Types และ Coercion

JavaScript มีค่าสองประเภท:

Primitives — ไม่เปลี่ยนแปลงได้ (immutable), เก็บโดยค่า (by value):

  • string, number, bigint, boolean, undefined, null, symbol

Objects — เปลี่ยนแปลงได้ (mutable), เก็บโดยอ้างอิง (by reference):

  • Plain objects {}, arrays [], functions, Map, Set, Date เป็นต้น
// Primitives: แต่ละตัวแปรถือสำเนาอิสระ
let a = 42;
let b = a;
b = 99;
console.log(a); // 42 — ไม่เปลี่ยน
// Objects: ทั้งสองตัวแปรชี้ไปยัง object เดียวกัน
const x = { count: 0 };
const y = x;
y.count = 5;
console.log(x.count); // 5 — object เดียวกัน

typeof คืนค่าสตริงที่อธิบาย type ของค่า ผลลัพธ์บางอย่างน่าแปลกใจ:

typeof 42 // 'number'
typeof 'hello' // 'string'
typeof true // 'boolean'
typeof undefined // 'undefined'
typeof null // 'object' ← bug ทางประวัติศาสตร์ แก้ไขไม่ได้
typeof {} // 'object'
typeof [] // 'object' ← arrays เป็น objects
typeof function(){} // 'function'
typeof Symbol() // 'symbol'
typeof 9007n // 'bigint'

ความผิดพลาด typeof null === 'object' มีอยู่ใน spec ตั้งแต่ JavaScript 1.0 หากต้องการตรวจสอบ null โดยเฉพาะ ใช้ value === null

== ทำ type coercion ก่อนเปรียบเทียบ ส่วน === ไม่ทำ — ตรวจสอบทั้งค่าและ type

0 == false // true — false coerces เป็น 0
0 === false // false — number vs boolean
'' == false // true — ทั้งคู่ coerces เป็น 0
'' === false // false
null == undefined // true — กฎพิเศษ
null === undefined // false
1 == '1' // true — '1' coerces เป็น 1
1 === '1' // false

ค่าทุกตัวเป็น truthy หรือ falsy เมื่อใช้ใน context ของ boolean

Falsy values — มีเพียงหกตัวเท่านั้น:

  • false, 0, '' (สตริงว่าง), null, undefined, NaN

ทุกอย่างอื่นเป็น truthy — รวมถึง [], {}, '0' และ 'false'

if ([]) console.log('empty array is truthy'); // แสดงผล
if ({}) console.log('empty object is truthy'); // แสดงผล
if (0) console.log('zero is truthy'); // ไม่แสดงผล
// สังเกต coercion ที่น่าแปลกใจ
console.log(0 == false); // true
console.log(0 === false); // false
console.log(null == undefined); // true
console.log(null === undefined); // false
console.log([] == false); // true — [] coerces เป็น '' coerces เป็น 0
console.log(Boolean([])); // true — [] เป็น truthy!
console.log(typeof null); // object
JavaScript
`typeof null` คืนค่าอะไรใน JavaScript?
ค่าใดต่อไปนี้เป็น falsy?
ผลลัพธ์ของ `null == undefined` คืออะไร?