ตัวดำเนินการ typeof
และ instanceof
ใช้เพื่อกำหนดประเภทข้อมูล แต่สถานการณ์การใช้งานแตกต่างกัน และรายละเอียดบางอย่างจำเป็นต้องได้รับการดูแลเป็นพิเศษ มาดูกันต่อไป เชี่ยวชาญประเด็นความรู้นี้อย่างถี่ถ้วน และอย่ากลัวคำถามของผู้สัมภาษณ์อีกต่อไป
typeof
เป็นตัวดำเนินการเอกภาคที่วางไว้หน้าตัวถูกดำเนินการ ซึ่งสามารถเป็นประเภทใดก็ได้ ส่งคืนสตริงที่อธิบายประเภทของตัวถูกดำเนินการ โปรดดูที่เกาลัด:
const type = typeof 'Long Live China'; // string ประเภท 666; //หมายเลข ประเภทจริง; // บูลีน ประเภทของไม่ได้กำหนด; // ไม่ได้กำหนด ประเภทของสัญลักษณ์(); // สัญลักษณ์ ประเภท 1n; // bigint typeof () => {}; // ฟังก์ชั่น ประเภทของ []; // วัตถุ ประเภทของ {}; // วัตถุ ประเภทของสตริงใหม่ ('xxx'); // object typeof null; // object
ดังที่เห็นได้จากตัวอย่างข้างต้น typeof
สามารถกำหนดประเภทข้อมูลและฟังก์ชันพื้นฐานได้อย่างแม่นยำเท่านั้น (จริงๆ แล้วฟังก์ชันเป็นวัตถุและไม่ได้อยู่ในประเภทข้อมูลอื่น แต่สามารถแยกแยะได้โดยใช้ typeof) และไม่สามารถ ถูกกำหนดอย่างถูกต้อง ประเภทข้อมูลอ้างอิงออก (ออบเจ็กต์ส่งคืนทั้งหมด)
สิ่งหนึ่งที่ควรทราบคือการเรียก typeof null
ส่งคืน object
นี่เป็นเพราะค่าพิเศษ null
ถือเป็นการอ้างอิงถึงวัตถุ null (เรียกอีกอย่างว่าตัวชี้วัตถุ null)
หากคุณต้องการระบุประเภทข้อมูลอ้างอิงอย่างถูกต้อง คุณสามารถใช้ตัวดำเนินการ instanceof
ตัวดำเนินการ instanceof
จะถูกวางไว้หลังตัวถูกดำเนินการและก่อนวัตถุที่กำหนด มันจะส่งกลับค่าบูลีนที่ระบุว่าตัวถูกดำเนินการเป็นอินสแตนซ์ของวัตถุที่กำหนดหรือไม่:
const result = [] instanceof Array; // true const บุคคล = ฟังก์ชั่น () {}; const p = บุคคลใหม่ (); p อินสแตนซ์ของบุคคล; // จริง ข้อความ const = สตริงใหม่ ('xxx'); ข้อความ instanceof String; // true
typeof จะส่งคืนประเภทพื้นฐานของตัวถูกดำเนินการ, instanceof ส่งคืนค่าบูลีน
instanceof สามารถกำหนดประเภทข้อมูลอ้างอิงได้อย่างถูกต้อง แต่ไม่สามารถระบุประเภทข้อมูลพื้นฐานของประเภทข้อมูลได้อย่างถูกต้อง
แม้ว่าจะสามารถกำหนดประเภทข้อมูลพื้นฐานได้ ( ยกเว้น null) แต่เป็นไปไม่ได้ที่จะกำหนดประเภทข้อมูลอ้างอิง (ยกเว้นฟังก์ชัน)
typeof
และ instanceof
มีข้อเสียบางประการและไม่สามารถตอบสนองความต้องการของทุกสถานการณ์ได้ หากคุณต้องการตรวจจับประเภทข้อมูลแบบสากล คุณสามารถใช้เมธอด Object.prototype.toString.call()
ได้:
Object.prototype.toString.call({}); // "[object Object]" Object.prototype.toString.call([]); // "[อาร์เรย์วัตถุ]" Object.prototype.toString.call(666); // "[หมายเลขวัตถุ]" Object.prototype.toString.call('xxx'); // "[object String]"
โปรดทราบว่าเมธอดนี้จะส่งคืนสตริงในรูปแบบของ "[object Object]"
เพื่อความสะดวกในการใช้งาน เราสามารถสรุปวิธีนี้ได้:
function getType(value) { ให้ type = ค่า typeof; if (type !== 'object') { // ถ้าเป็นประเภทข้อมูลพื้นฐาน ให้ return โดยตรง return type; - // หากเป็นประเภทข้อมูลอ้างอิง จะมีการพิจารณาเพิ่มเติม และผลลัพธ์ที่ส่งคืนปกติคือ return Object.prototype.toString.call(value).replace(/^[object (S+)]$/, ' $1'); - getType(123); // หมายเลข getType('xxx'); // string getType(() => {}); // ฟังก์ชั่น getType([]); // Array getType({}); // วัตถุ getType(null); // Null