Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   когда можно использовать for(var k in arr) (https://javascript.ru/forum/misc/1655-kogda-mozhno-ispolzovat-var-k-arr.html)

scuter 29.08.2008 11:25

когда можно использовать for(var k in arr)
 
на сколько я знаю в JS нет такого понятия как многомерный массив, есть только обьекты,
но частенько появляется необходимость обработать этот объект в цыкле,
когда там только цыфорки(в индексе),
то обрабатывается всё так
for(var k=0; k<arr.length; k++)
,
но когда в индеексе слова обрабатывается так
for(var k in arr)

если не правильно обрабатывать объект то броузер скажет "не хочу работать",
скажите как определить когда как обрабатывать объект.

только не так как я это сейчас определяю методом тыка.

Kolyaj 29.08.2008 11:28

Каша какая-то у вас в голове.

Есть массив ([] или new Array()), а есть объект-хэш ({} или new Object()).

Цитата:

Сообщение от scuter
на сколько я знаю в JS нет такого понятия как многомерный массив

[[],[],[],[]] - двумерный массив.

Autosof 29.08.2008 11:42

Цитата:

Сообщение от scuter (Сообщение 5118)
скажите как определить когда как обрабатывать объект

typeof?

ZoNT 29.08.2008 11:58

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

scuter 29.08.2008 12:03

попробуй запустить эту функцию,
и поймёшь о чём я говорю,
test = function()
{
	var arr = [[],[],[]];
	alert('arr = ('+typeof arr+')');
	var arr2 = new Array();
	alert('arr2 = ('+typeof arr2+')');
	var obj = {};
	alert('obj = ('+typeof obj+')');
	var obj2 = new Object();
	alert('obj2 = ('+typeof obj2+')');
}

Kolyaj 29.08.2008 12:14

Цитата:

Сообщение от Autosof
typeof?

Цитата:

Сообщение от ZoNT
function isArray(o){return isObject(o) && o.length && (!isString(o))}

Исходных кодов а-ля jQuery начитались?

[] instanceof Array

ZoNT 29.08.2008 12:18

function isObject(o){return typeof o=="object"}
function isArray(o){return isObject(o) && o.constructor.prototype.hasOwnProperty('length')}

ZoNT 29.08.2008 12:20

вот так получше и если вызвать эту функцию из дочернего фрейма, то сработает... А если вызвать функцию в которой будет [] instanceof Array, то в другом документе (фрейме), свой инстанс - не сработает..

Kolyaj 29.08.2008 13:01

Цитата:

Сообщение от ZoNT
function isArray(o){return isObject(o) && o.constructor.prototype.hasOwnProperty('length')}

var BadArray = function() {};
BadArray.prototype = {length: 0};
isArray(new BadArray()); // ???


Свойство length может быть у любого объекта на вполне законных основаниях.

ZoNT 29.08.2008 13:20

Это естественно, но другого нормального метода нет. Иначе надо проверять элемент в контексте документа, где он создан... Геморрой придумывает разработчик сам себе.
Я уже ранее сказал, что я с таким никогда не сталкивался, так как просто надо заранее подумать "а нафига такие извращения".

Kolyaj 29.08.2008 13:46

ZoNT, можно извратиться для фрэймов
function isArray(o) {
  return typeof o.toSource == 'function' && eval(o.toSource()) instanceof Array;
}


З.Ы. Правда toSource только в Gecko работает :)

Kolyaj 29.08.2008 13:53

А вообще, если сильно надо, то в каждом фрэйме написать
Array.prototype._itIsArray = true;

тогда
function isArray(o) {
  return !!o._itIsArray;
}

ZoNT 29.08.2008 14:04

это тоже верное решение, но только если это ты создал фрейм и это не модуль какой-нибудь сторонний...

scuter 29.08.2008 14:16

вроди такое дело может помоч,
провда не знаю на сколько грамотное это решение.
function isArray(o)
{
	if(o.length || (o instanceof Array))
	{
		return true;
	}
	else
	{
		return false;
	}
}

но всегда есть какое то но.

vandy 29.08.2008 14:18

Когда мне понадобилось определять тип данных из другого фрейма, то была изобретена функция
function getType(obj) {
   var type = typeof(obj);
   if (type == 'object') {
     if (obj) {
       if(!obj.nodeType) {
         type = (obj.window && obj == obj.window);
         if (!type) {
           type = Object.prototype.toString.apply(obj);
           type = type.substring(8,type.length-1);
         } else type = 'window';
       } else type = obj.nodeName;
     } else type = 'null';
   }
   return type.toLowerCase();
 }


Тогда это долго обсуждалось на форуме xpoint.ru.

vandy 29.08.2008 14:22

Вот нашел ссылку на обсуждение
http://xpoint.ru/forums/programming/...ad/41143.xhtml

ZoNT 29.08.2008 15:24

Хороший пример :)

vandy 29.08.2008 15:34

Плохих не держим :)


Часовой пояс GMT +3, время: 15:27.