Различать массив и хэш в 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/