Types และ Coercion
Primitives vs objects
หัวข้อที่มีชื่อว่า “Primitives vs objects”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 เป็น objectstypeof function(){} // 'function'typeof Symbol() // 'symbol'typeof 9007n // 'bigint'ความผิดพลาด typeof null === 'object' มีอยู่ใน spec ตั้งแต่ JavaScript 1.0 หากต้องการตรวจสอบ null โดยเฉพาะ ใช้ value === null
== vs ===
หัวข้อที่มีชื่อว่า “== vs ===”== ทำ type coercion ก่อนเปรียบเทียบ ส่วน === ไม่ทำ — ตรวจสอบทั้งค่าและ type
0 == false // true — false coerces เป็น 00 === false // false — number vs boolean
'' == false // true — ทั้งคู่ coerces เป็น 0'' === false // false
null == undefined // true — กฎพิเศษnull === undefined // false
1 == '1' // true — '1' coerces เป็น 11 === '1' // falseTruthy และ Falsy
หัวข้อที่มีชื่อว่า “Truthy และ Falsy”ค่าทุกตัวเป็น 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'); // ไม่แสดงผลDemo Coercion ที่รันได้
หัวข้อที่มีชื่อว่า “Demo Coercion ที่รันได้”// สังเกต coercion ที่น่าแปลกใจconsole.log(0 == false); // trueconsole.log(0 === false); // falseconsole.log(null == undefined); // trueconsole.log(null === undefined); // falseconsole.log([] == false); // true — [] coerces เป็น '' coerces เป็น 0console.log(Boolean([])); // true — [] เป็น truthy!console.log(typeof null); // object