Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распознать переменную типа Array, по типу typeof 
V
    Опции темы
Stampede
Дата 3.5.2007, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 4
Всего: 144



Собственно, сабж.

Вот я получил, скажем, в параметрах некий объект. Если это массив, мне нужно обработать его каким-то особым образом. Как мне узнать, массив это или нет? Пробовал typeof, но он возвращает обычный 'object'. Думал различать по свойству length, но оно тоже есть у всех объектов.

Что еще можно придумать?



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
ksnk
Дата 3.5.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



  •  Способ забавный
    Код

      Array.prototype={itsarray:true}
    ...
      function IsArray(o) {return !!o.itsarray}
  •  Можно пользовать функции push/pop/join/concat/... для индикации



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Zeroglif
Дата 3.5.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Stampede,

самое незамысловатое:

Код

var isArray = function(arg) { 
    return (arg instanceof Array);
}

alert(isArray([])); //-> true
alert(isArray({})); //-> false

но нужно помнить, что:

1) есть пожилые версии браузеров, не поддерживающие оператор instanceof;
2) цепь прототипов можно (исходя из задач) руками как-то "поправить", при этом найдётся массив там, где его нет:

Код

function f() {};
f.prototype = [];
var obj = new f();
alert(obj instanceof Array); //-> true, хотя это не массив

PM MAIL WWW   Вверх
Stampede
Дата 3.5.2007, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 4
Всего: 144



Цитата(ksnk @  3.5.2007,  11:03 Найти цитируемый пост)
Array.prototype={itsarray:true}


Аккуратнее с подменой прототипов. Если уж в таком ключе, то:
Код

Array.prototype.isArray = true;

Я примерно так и собирался делать, если бы ничего лучшего не нашлось. Но тут подоспел Zeroglif smile:

Цитата(Zeroglif @  3.5.2007,  12:54 Найти цитируемый пост)
arg instanceof Array


О, вот этого я не знал. Тем более про возможные "неожиданности" smile Спасибо, и держи плюса smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
GZep
Дата 3.5.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

Репутация: 2
Всего: 32



Цитата(Zeroglif @  3.5.2007,  21:54 Найти цитируемый пост)
alert(obj instanceof Array); //-> true, хотя это не массив

не понял. Почему так? smile 


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
ksnk
Дата 3.5.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Цитата(Zeroglif @  3.5.2007,  21:54 Найти цитируемый пост)
при этом найдётся массив там, где его нет
 И действительно, объект, обладающий всеми свойствами массива вполне может считаться массивом ;)



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
GZep
Дата 3.5.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

Репутация: 2
Всего: 32



ну так не свойство же подставили, а сам объект! почему так ведет себя javascript?


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
Zeroglif
Дата 4.5.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(GZep @  3.5.2007,  22:59 Найти цитируемый пост)
почему так ведет себя javascript

Ну, так просто работает оператор instanceof, рыская по всей цепи прототипов.

Код

function f() {};
f.prototype = [];
var obj = new f();

alert(obj instanceof f);      //-> true
alert(obj instanceof Array);  //-> true
alert(obj instanceof Object); //-> true

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.