ใน JavaScript ทุกอย่างเป็นวัตถุ (หรืออย่างน้อยอาจได้รับการปฏิบัติเหมือนเป็นวัตถุ) ยกเว้นprimitives (booleans, null, ตัวเลข, สตริงและค่าundefined
(และสัญลักษณ์ใน ES6)):
console.log(typeof true); // boolean
console.log(typeof 0); // number
console.log(typeof ""); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {}); // function
ในขณะที่คุณสามารถดูวัตถุอาร์เรย์และค่าnull
เป็นวัตถุที่พิจารณาทั้งหมด ( null
เป็นการอ้างอิงถึงวัตถุที่ไม่มีอยู่) ฟังก์ชั่นจะแตกต่างเพราะพวกเขาเป็นวัตถุชนิดcallableพิเศษ อย่างไรก็ตามพวกเขายังคงเป็นวัตถุ
บนมืออื่น ๆ ตัวอักษรtrue
, 0
, ""
และundefined
ไม่ได้เป็นวัตถุ เป็นค่าดั้งเดิมใน JavaScript อย่างไรก็ตาม booleans ตัวเลขและสตริงยังมีการก่อสร้างBoolean
, Number
และString
ตามลำดับซึ่งห่อพื้นฐานของตนเพื่อให้การทำงานเพิ่ม:
console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0)); // object
console.log(typeof new String("")); // object
ที่คุณสามารถดูเมื่อค่าดั้งเดิมถูกห่อภายในBoolean
, Number
และString
การก่อสร้างตามลำดับพวกเขากลายเป็นวัตถุ instanceof
ประกอบการทำงานเฉพาะสำหรับวัตถุ (ซึ่งเป็นเหตุผลที่จะส่งกลับfalse
ค่าดั้งเดิม):
console.log(true instanceof Boolean); // false
console.log(0 instanceof Number); // false
console.log("" instanceof String); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(new Number(0) instanceof Number); // true
console.log(new String("") instanceof String); // true
ตามที่คุณเห็นทั้งสองtypeof
และinstanceof
ไม่เพียงพอที่จะทดสอบว่าค่าเป็นบูลีนตัวเลขหรือสตริง - typeof
ใช้ได้กับบูลีนดั้งเดิมตัวเลขและสตริงเท่านั้น และinstanceof
ไม่สามารถใช้ได้กับบูลีนดั้งเดิมตัวเลขและสตริง
โชคดีที่มีวิธีแก้ไขปัญหานี้อย่างง่าย การใช้งานเริ่มต้นของtoString
(เช่นตามที่กำหนดไว้ในObject.prototype.toString
) ส่งคืน[[Class]]
ทรัพย์สินภายในของทั้งค่าดั้งเดิมและวัตถุ:
function classOf(value) {
return Object.prototype.toString.call(value);
}
console.log(classOf(true)); // [object Boolean]
console.log(classOf(0)); // [object Number]
console.log(classOf("")); // [object String]
console.log(classOf(new Boolean(true))); // [object Boolean]
console.log(classOf(new Number(0))); // [object Number]
console.log(classOf(new String(""))); // [object String]
[[Class]]
คุณสมบัติภายในของค่ามีประโยชน์มากกว่าtypeof
ค่าดังกล่าว เราสามารถใช้Object.prototype.toString
ในการสร้างtypeof
ผู้ประกอบการเวอร์ชั่น (มีประโยชน์) ของเราเองดังต่อไปนี้:
function typeOf(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
console.log(typeOf(true)); // Boolean
console.log(typeOf(0)); // Number
console.log(typeOf("")); // String
console.log(typeOf(new Boolean(true))); // Boolean
console.log(typeOf(new Number(0))); // Number
console.log(typeOf(new String(""))); // String
หวังว่าบทความนี้จะช่วย หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างวัตถุพื้นฐานและวัตถุที่ห่อหุ้มอ่านโพสต์บล็อกต่อไปนี้: ชีวิตลับของ JavaScript พื้นฐาน