Как проверить, не является ли объект массивом?

Таким образом, у меня есть функция, которая должна проверить, является ли аргументом объект, но это перестало работать потому что:

typeof [] // returns 'object'

Это - классический глюк JavaScript, но я не могу помнить, что сделать для фактического принятия объектов, но не массивов.

35
задан hojberg 15 February 2010 в 12:38
поделиться

3 ответа

Попробуйте что-то вроде этого:

obj.constructor.toString().indexOf("Array") != -1

или (даже лучше)

obj instanceof Array
40
ответ дан 27 November 2019 в 06:40
поделиться

Все эти ответы, предлагающие вам проверить (так или иначе), является ли объект экземпляром класса «Array» (то есть созданным «Array»), на самом деле не являются безопасными решениями. Иногда они будут работать, может быть, большую часть времени, но все основные фреймворки отошли от этого подхода. Одна из основных проблем с этим возникает, когда происходит взаимодействие между несколькими окнами (обычно, родительским окном и одним или несколькими фреймами или окнами iframe). Если вы передадите объект массива, созданный в одном окне, в резидент API в другом окне, все эти тесты не пройдут. Почему? Потому что вы проверяете, является ли объект экземпляром класса «Array» в контексте вашего локального окна . Другими словами, когда вы ссылаетесь на «Array» в

if (myobject instanceof Array) { ... }

, то, конечно же, вы ссылаетесь на window.Array . Итак, массив, построенный в другом окне , не будет экземпляром класса Array в вашем окне!

Проверка имени конструктора, вероятно, немного безопаснее, но все же рискованно. На мой взгляд, вам лучше использовать метод утиного набора текста. То есть вместо того, чтобы спрашивать: «Это массив?» спросите вместо этого: «Похоже, этот объект поддерживает какой-то конкретный набор API-интерфейсов Array, который мне нужен в данной ситуации?» Например, "имеет ли этот объект свойство length ?" Javascript - довольно «мягкий» язык, и почти все можно изменять. Таким образом, даже если вы обнаружите, что что-то было построено с помощью "Array", вы все еще действительно не знаете наверняка, что вы можете сделать с этим или с ним.

[edit] Спасибо за эту ссылку, @Lachlan - вот очень четкое описание проблемы: http://juhukinners.com/2009/01 / 11 / тип-считается-бесполезным-или-как-писать-надежные-проверки типов /

22
ответ дан 27 November 2019 в 06:40
поделиться

Вы пробовали это:

var test = [];
if(test instanceof Array) {
 ...
}

ИЗМЕНИТЬ : этот метод не работает в средах с несколькими кадрами DOM ( 'typeof 'считается бесполезным - или как писать надежные проверки типов ). (через Пойнти )

2
ответ дан 27 November 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: