2015-08-07 3 views
3

Каков наилучший способ определения типа объекта: Array и почему ?.Оптимальный способ определения типа массива

var arr = []; 

// Method #1 
Array.isArray(arr); 

// Method #2 
toString.call(arr) == "[object Array]" 

// Method #3 
arr.constructor == Array 
+2

Мне кажется очевидным, что лучший способ - использовать функцию, созданную именно для этой цели, а именно «Array.isArray». Я не вижу, как любой из других способов может быть лучше, но, может быть, кто-то может доказать мне, что я ошибаюсь. –

+0

FWIW, все они корректно выдают 'false' на специальный объект' arguments', определенный внутри функции. – Paul

+0

Или буквальный дубликат: [Что лучший способ узнать, является ли объект массивом] (http://stackoverflow.com/q/7447425/1048572) – Bergi

ответ

3

Все три метода могут использоваться для проверки, является ли переменная типа Array. Однако есть некоторые нюансы. Я начну с последнего на первое.

Способ №3. Не будет работать, если переменная, о которой идет речь, была получена из другого winndow/frame. В этом случае конструктор укажет другой объект Array, и эта проверка вернет false. По этой же причине arr instanceof Array не является пуленепробиваемым. Таким образом, он не на 100% надежный.

Способ № 2. Это метод, который традиционно используется для проверки типа массива. Фактически, Array.isArraypolyfill основан на этом методе. Единственный недостаток заключается в том, что он громоздкий и многословный.

Способ №1. Является ли это одним из ES5, который, наконец, должен использоваться для проверки типа массива, независимо от того, из какого массива realm (например, iframe). Это лучший в списке.

0

Предпочитаемый способ заключается в использовании Array.isArray. Это присутствует в спецификации языка ES5 и довольно хорошо поддерживается браузерами.

Если вы планируете поддерживать старые браузеры, вы можете найти полипол на MDN. Полипол в основном является вашим вторым вариантом.

Последний вариант не будет работать, если вы играете с iframes.

var arr = myIframe.contentWindow.myArray; 
console.log(obj.constructor === Array); //false 

Причина заключается в том, что Array конструктор Diffferent для каждого объекта window. Использование этого для обнаружения массивов будет работать в 99% случаев, но в один прекрасный день произойдет внезапное провал.

Смежные вопросы