Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   DOMNodeList to Array (https://javascript.ru/forum/misc/1620-domnodelist-array.html)

Octane 24.08.2008 23:40

DOMNodeList to Array
 
Возможно ли выполнить подобное в IE:
var array = [].slice.call(document.body.childNodes);


Странно, почему же тогда код успешно выполняется и в IE с «arguments», который тоже не является «Array»?
(function(a, b, c) {
	alert([].slice.call(arguments).length);
})(1, 2, 3);

Kolyaj 25.08.2008 09:29

Ну arguments, как минимум, является объектом JScript, а DOMNodeList -- объектом DOM.

ZoNT 25.08.2008 12:46

Цитата:

Сообщение от Octane (Сообщение 4937)
Возможно ли выполнить подобное в IE:
var array = [].slice.call(document.body.childNodes);


Странно, почему же тогда код успешно выполняется и в IE с «arguments», который тоже не является «Array»?
(function(a, b, c) {
	alert([].slice.call(arguments).length);
})(1, 2, 3);

И что тут удивительного?
Ты вызываешь метод slice пустого массива, передаёшь (смотри формат комманды call) ему arguments, а сартИндекс и ЭндИндекс не передаёшь, соответственно он возвращает НОВЫЙ массив со всеми элементами (с первого по последний), что были в arguments.

Kolyaj 25.08.2008 12:55

ZoNT, вопрос не в том, почему работает с arguments, а в том, почему не работает с DOMNodeList.

ZoNT 25.08.2008 12:57

потому что аргументс - это почти массив, а домлист - это дом лист...

Kolyaj 25.08.2008 13:00

Оригинальный ответ :) Следовательно, во всех браузерах, кроме ИЕ, DOMNodeList -- это почти массив.

З.Ы. Что за нечеткая логика? Объект или является массивом, или не является, третьего не дано. Ни arguments, ни DOMNodeList массивами не являются.

ZoNT 25.08.2008 13:03

Он не является нигде, просто некоторые браузеры работают с ним по-разному и всё...
Это как парсинг даты: можно написать чтобы он жрал некорректные строки, а можно чётко придерживаться стандарта...

Kolyaj 25.08.2008 13:33

Цитата:

Сообщение от ZoNT
Он не является нигде

Если бы DOMNodeList являлся массивом, темы бы не было. Вопрос в том, как преобразовать коллекцию в массив без перебора элементов.

ZoNT 25.08.2008 13:34

я подумаю :)
Ни разу таким вопросом не задавался...

А оно надо? Помоему перебор - тоже неплохо... А нестандартный способ будет наверняка не быстрее...

Octane 25.08.2008 16:07

Цитата:

Сообщение от ZoNT (Сообщение 4949)
смотри формат комманды call

Работает же везде без остальных параметров... а в IE ни с параметрами, ни без них, ни с «apply» — вообще никак :(

Цитата:

Сообщение от ZoNT (Сообщение 4949)
А оно надо? Помоему перебор - тоже неплохо...

«Перебор» — пользовательская функции, мне кажется «slice» будет быстрее :) А вообще было бы удобно реализовать такую возможность, чтобы не писать отдельную функцию для перевода «DOMNodeList» в «Array», когда требуются методы работы с «Array», например «push». :cool:

p.s. в «jQuery» есть метод «makeArray» (v.1.2.6, line 1129):
makeArray: function( array ) {
		var ret = [];

		if( array != null ){
			var i = array.length;
			//the window, strings and functions also have 'length'
			if( i == null || array.split || array.setInterval || array.call )
				ret[0] = array;
			else
				while( i )
					ret[--i] = array[i];
		}

		return ret;
	},

Реализовано перебором, правда каким-то извращенным... Интересно, они не догадались про «slice» или не используют его, потому что не возможно заставить работать в IE? :rolleyes:

p.p.s. не зря, наверное, придумали «makeArray» в «jQuery», значит нужная функция.


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