Различать массив и хэш в javascript с помощью typeof()

Возможный дубликат:
В javascript мы можем определить, является ли объект Hash или Array?

В javascript

typeof([])

и

typeof({})

оба возвращают "объект".

Как я могу достоверно различать массив и ассоциативный массив в Javascript?

Я подумал о тестировании объекта, о котором идет речь, чтобы узнать, имеет ли он атрибут length (указывающий, что он будет массивом), но что тогда следует также рассматривать как массив:

{length:5}

Ответ 1

В современных браузерах встроен Array.isArray.

Для старых браузеров вы можете проверить эту функцию и добавить ее при необходимости.

if( typeof Array.isArray !== 'function' ) {
    Array.isArray = function( arr ) {
        return Object.prototype.toString.call( arr ) === '[object Array]';
    };
}

alert( Array.isArray( [] ) );

EDIT:

Array.isArray является частью ECMAScript 5:

15.4.3.2 Array.isArray(arg)

Функция isArray принимает один аргумент arg и возвращает логическое значение true, если аргумент является объектом, внутренним свойством класса которого является "Array"; иначе он возвращает false. Сделаны следующие шаги:

  • Если Type (arg) не Object, верните false.
  • Если значением внутреннего свойства [[Class]] для arg является "Array", тогда верните true.
  • Возвращает false.

Ответ 2

Хорошей идеей является проверка внутреннего значения [[CClass]]. Для этого вам нужно вызвать Object.prototype.toString:

var toStr = Object.prototype.toString;

toStr.call([]);  // === [object Array]
toStr.call({});  // === [object Object]

Ответ 3

Ассоциативные массивы не существуют в Javascript.

В массиве могут быть только цифровые клавиши. Если вы получаете доступ к строковому ключу, вы фактически используете ярлык, который в точности эквивалентен нотации объекта.

http://www.quirksmode.org/js/associative.html

http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/