การตรวจสอบประเภทของวัตถุใน JS ทำได้ผ่านทางinstanceofเช่น
obj instanceof Array
สิ่งนี้จะใช้ไม่ได้หากวัตถุถูกส่งข้ามขอบเขตเฟรมเนื่องจากแต่ละเฟรมมีArrayวัตถุของตัวเอง คุณสามารถแก้ปัญหานี้ได้โดยตรวจสอบคุณสมบัติ[[Class]] ภายในของออบเจ็กต์ ในการรับมันให้ใช้Object.prototype.toString()(สิ่งนี้รับประกันว่าจะทำงานโดย ECMA-262):
Object.prototype.toString.call(obj) === '[object Array]'
วิธีการทั้งสองจะใช้ได้เฉพาะกับอาร์เรย์จริงเท่านั้นไม่ใช่วัตถุที่มีลักษณะคล้ายอาร์เรย์เช่นรายการargumentsวัตถุหรือโหนด เนื่องจากวัตถุที่มีลักษณะคล้ายอาร์เรย์ทั้งหมดต้องมีlengthคุณสมบัติเป็นตัวเลขฉันจึงตรวจสอบสิ่งเหล่านี้ดังนี้:
typeof obj !== 'undefined' && obj !== null && typeof obj.length === 'number'
โปรดทราบว่าสตริงจะผ่านการตรวจสอบนี้ซึ่งอาจนำไปสู่ปัญหาเนื่องจาก IE ไม่อนุญาตให้เข้าถึงอักขระของสตริงด้วยดัชนี ดังนั้นคุณอาจต้องการที่จะเปลี่ยนtypeof obj !== 'undefined'เพื่อtypeof obj === 'object'ที่จะไม่รวมวิทยาการและวัตถุโฮสต์ที่มีชนิดที่แตกต่างจาก'object' alltogether สิ่งนี้จะยังคงปล่อยให้สตริงออบเจ็กต์ผ่านซึ่งจะต้องถูกแยกออกด้วยตนเอง
ในกรณีส่วนใหญ่สิ่งที่คุณอยากรู้คือคุณสามารถทำซ้ำบนวัตถุผ่านดัชนีตัวเลขได้หรือไม่ ดังนั้นจึงควรตรวจสอบว่าวัตถุมีคุณสมบัติที่ตั้งชื่อ0แทนหรือไม่ซึ่งสามารถทำได้ผ่านการตรวจสอบอย่างใดอย่างหนึ่งต่อไปนี้:
typeof obj[0] !== 'undefined' // false negative for `obj[0] = undefined`
obj.hasOwnProperty('0') // exclude array-likes with inherited entries
'0' in Object(obj) // include array-likes with inherited entries
การส่งไปยังออบเจ็กต์เป็นสิ่งที่จำเป็นในการทำงานอย่างถูกต้องสำหรับไพรมารีเหมือนอาร์เรย์ (เช่นสตริง)
นี่คือรหัสสำหรับการตรวจสอบอาร์เรย์ JS ที่มีประสิทธิภาพ:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
และทำซ้ำได้ (เช่นไม่ว่างเปล่า) วัตถุคล้ายอาร์เรย์:
function isNonEmptyArrayLike(obj) {
try { // don't bother with `typeof` - just access `length` and `catch`
return obj.length > 0 && '0' in Object(obj);
}
catch(e) {
return false;
}
}