Перевірка типу об’єктів у 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'
. Це все ще дозволить пропускати рядкові об'єкти, які доведеться виключити вручну.
У більшості випадків ви насправді хочете знати, чи можете ви перебирати об’єкт за допомогою числових індексів. Тому може бути корисним перевірити, чи має об’єкт 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;
}
}