Pemeriksaan jenis objek di JS dilakukan melalui instanceof, yaitu
obj instanceof Array
Ini tidak akan berfungsi jika objek melewati batas bingkai karena setiap bingkai memiliki Arrayobjeknya sendiri . Anda bisa menyiasatinya dengan memeriksa properti internal [[Class]] dari objek. Untuk mendapatkannya, gunakan Object.prototype.toString()(ini dijamin bekerja oleh ECMA-262):
Object.prototype.toString.call(obj) === '[object Array]'
Kedua metode hanya akan bekerja untuk array yang sebenarnya dan bukan objek seperti array seperti argumentsobjek atau daftar node. Karena semua objek yang mirip array harus memiliki lengthproperti numerik , saya akan memeriksanya seperti ini:
typeof obj !== 'undefined' && obj !== null && typeof obj.length === 'number'
Harap dicatat bahwa string akan melewati pemeriksaan ini, yang dapat menyebabkan masalah karena IE tidak mengizinkan akses ke karakter string dengan indeks. Oleh karena itu, Anda mungkin ingin mengubah typeof obj !== 'undefined'ke typeof obj === 'object'mengecualikan primitif dan benda-benda host dengan jenis yang berbeda dari 'object'alltogether. Ini akan tetap membiarkan objek string lewat, yang harus dikecualikan secara manual.
Dalam kebanyakan kasus, yang sebenarnya ingin Anda ketahui adalah apakah Anda dapat melakukan iterasi pada objek melalui indeks numerik. Oleh karena itu, sebaiknya periksa apakah objek tersebut memiliki properti bernama 0, yang bisa dilakukan melalui salah satu pemeriksaan berikut:
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
Cast to object diperlukan untuk bekerja dengan benar untuk primitif mirip-array (yaitu string).
Berikut kode untuk pemeriksaan kuat untuk array JS:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
dan objek seperti array yang dapat diulang (yaitu tidak kosong):
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;
}
}