ตัวห่อวัตถุใน JavaScript
บทความนี้อธิบายเกี่ยวกับตัวห่อวัตถุใน JavaScript
YouTube Video
วัตถุห่อหุ้ม
JavaScript มี primitive types และอ็อบเจกต์ที่ใช้จัดการกับมัน (wrapper objects)
ประเภทดั้งเดิม
Primitive types แทนค่าข้อมูล เพียงค่าเดียว และมีโครงสร้างที่ง่ายและเบา สิ่งเหล่านี้เป็น immutable (ไม่สามารถเปลี่ยนแปลงได้) และไม่มีเมธอดหรือคุณสมบัติของออบเจ็กต์โดยตรง แต่สามารถแปลงเป็นออบเจ็กต์ตัวห่อชั่วคราวสำหรับการดำเนินการได้
string และ number เป็นตัวอย่างของ primitive types ในทางกลับกัน wrapper objects จะเริ่มต้นด้วยอักษรตัวใหญ่ เช่น String และ Number
ตัวห่อวัตถุ
เพื่อจัดการกับประเภทฐาน JavaScript จะสร้างวัตถุห่อ (Object) ชั่วคราว วัตถุห่อจะมีเมธอดและพร็อพเพอร์ตี้สำหรับประเภทฐาน
Number
1let numObject = new Number(42); // Wrapper object
2
3console.log(typeof numObject); // object
4console.log(numObject.valueOf()); // 42
5
6let numValue = Number(42); // Return primitive value
7
8console.log(typeof numValue); // number
9console.log(numValue); // 42
Numberเป็น ประเภทวัตถุที่ห่อหุ้มประเภทฐานnumberโดยการสร้างวัตถุNumberโดยชัดเจน คุณสามารถจัดการตัวเลขเหมือนกับnumberได้ แต่โดยปกติแนะนำให้ใช้ประเภทฐานnumber
typeof numObjectเป็น"object"แต่typeof 42เป็น"number"
- โปรดทราบว่าการใช้ตัวดำเนินการ
newเพื่อสร้างวัตถุห่อใหม่ จะให้ผลลัพธ์ที่แตกต่างจากการเรียกใช้Numberแบบฟังก์ชัน เมื่อถูกเรียกในฐานะฟังก์ชัน จะส่งคืนค่าชนิดข้อมูลพื้นฐานnumber
String
1let strObject = new String("Hello"); // Wrapper object
2
3console.log(typeof strObject); // object
4console.log(strObject.valueOf()); // Hello
- มันเป็น ประเภทวัตถุที่ห่อหุ้มประเภทฐาน
stringโดยการใช้วัตถุStringคุณสามารถเข้าถึงพร็อพเพอร์ตี้และเมธอดของสายอักขระได้ แต่โดยทั่วไปใช้ประเภทฐานstring
typeof strObjectเป็น"object"แต่typeof "Hello"เป็น"string"
- เช่นเดียวกับ
Numberการเรียกใช้Stringแบบฟังก์ชันจะคืนค่าประเภทฐานstring
Boolean
1let boolObject = new Boolean(true); // Wrapper object
2
3console.log(typeof boolObject); // object
4console.log(boolObject.valueOf()); // true
- มันเป็น ประเภทวัตถุที่ห่อหุ้มประเภทฐาน
booleanคุณสามารถสร้างวัตถุBooleanโดยชัดเจนได้ แต่โดยทั่วไปจะใช้ประเภทฐานboolean
typeof boolObjectเป็น"object"แต่typeof trueเป็น"boolean"
- เช่นเดียวกับ
Numberการเรียกใช้Booleanแบบฟังก์ชันจะคืนค่าประเภทฐานboolean
BigInt
1let bigIntObject = Object(9007199254740991n); // Wrapper object
2
3console.log(typeof bigIntObject); // object
4console.log(bigIntObject.valueOf()); // 9007199254740991n
5
6let bigIntValue = BigInt(9007199254740991); // Return primitive BigInt
7
8console.log(typeof bigIntValue); // bigint
9console.log(bigIntValue); // 9007199254740991n
10
11// Error
12let bigIntObject2 = new BigInt(9007199254740991n);Objectを使ってBigIntのラッパーオブジェクトを生成できますが、通常はプリミティブ型のbigintを直接使うのが一般的です。
typeof bigIntObjectは"object"であるのに対し、typeof 9007199254740991nは"bigint"です。
BigIntを関数として呼び出すとプリミティブなbigintを返しますが、new演算子をつけてBigIntのラッパーオブジェクトを生成することはできません。
Symbol
1let symObject = Object(Symbol("id")); // Wrapper object for Symbol
2
3console.log(typeof symObject); // object
4console.log(symObject.valueOf()); //
- คุณสามารถใช้
Objectเพื่อสร้างวัตถุห่อ (wrapper object) สำหรับSymbolได้ แต่โดยทั่วไป คุณควรใช้ประเภทฐาน (primitive type)Symbolโดยตรง
ความแตกต่างระหว่างประเภทฐานและวัตถุห่อ
- ประเภทฐาน มีน้ำหนักเบาและมีประสิทธิภาพด้านหน่วยความจำ แต่ไม่มีพร็อพเพอร์ตี้หรือเมธอดโดยตรง อย่างไรก็ตาม ใน JavaScript แม้แต่กับประเภทฐาน จะมีการสร้างวัตถุห่อชั่วคราวโดยอัตโนมัติเมื่อจำเป็นเพื่อให้เมธอดและพร็อพเพอร์ตี้
1let text = "Hello";
2
3// A temporary String object is created,
4// allowing access to the length property
5console.log(text.length);- วัตถุห่อ เป็นวัตถุที่สร้างขึ้นโดยชัดเจนซึ่งอาจส่งผลต่อหน่วยความจำและประสิทธิภาพ ดังนั้นจึงแนะนำให้ใช้ประเภทฐานโดยทั่วไป
บทสรุป
- ประเภทดั้งเดิม: ประเภทที่มีน้ำหนักเบา เช่น
number,string,boolean,null,undefined, และsymbolที่ไม่มีเมธอดโดยตรง - วัตถุห่อหุ้ม (Wrapper Objects): วัตถุเช่น
Number,StringและBooleanที่ถูกแปลงมาจากประเภทดั้งเดิมชั่วคราว
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย