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

ZoNT 25.08.2008 16:15

Это очень редкие случаи и это усложнит интерпретатор джаваскрипта...
Получится эволюция в сторону увеличения уровня языка: на ассемблере можно сделать всё и это будет работать ахриненно быстро, но ВСЁ придётся реализовывать самому, так как есть только простейшие команды. По мере навешивания высокоуровневого функционала становиться проще разрабатвывать программы, но высокоуровневые языки трудно переносимы, ограничены функционально, размер кода (готового) раздувается. Не факт, что реализация функционала самая оптимальная (ты не знаешь, так как это делал какой-то дядя, а не ты руками).

интерпретатору проще и быстрее обработать 10 команд (если их будет всего допустим 50 простых), чем обработать 3, но если придётся выбирать из 300 и они будет сложные и редкоиспользуемые...

Kolyaj 25.08.2008 16:27

Octane, вы аккуратнее у jQuery списывайте, там местами такой бред написан.

Octane 25.08.2008 18:04

Наоборот, стараюсь не списывать, а написать сам и найти более короткое решение :)

ZoNT 25.08.2008 18:48

в компилируемых языках более корткое - не значит более быстродействующее :)

Ну а в интерепретируемых конечно лучше стремиться к уменьшению количества кода...

Octane 23.12.2008 22:40

И опять makeArray :)

Доступна новая версия jQuery 1.3b1, в ней метод makeArray притерпел некоторые изменения и стал выглядеть следующим образом:
var makeArray = function(array, results) {
	array = Array.prototype.slice.call( array );

	if ( results ) {
		results.push.apply( results, array );
		return results;
	}
	
	return array;
};

// Perform a simple check to determine if the browser is capable of
// converting a NodeList to an array using builtin methods.
try {
	Array.prototype.slice.call( document.documentElement.childNodes );

// Provide a fallback method if it does not work
} catch(e){
	makeArray = function(array, results) {
		var ret = results || [];

		if ( array instanceof Array ) {
			Array.prototype.push.apply( ret, array );
		} else {
			if ( typeof array.length === "number" ) {
				for ( var i = 0, l = array.length; i < l; i++ ) {
					ret.push( array[i] );
				}
			} else {
				for ( var i = 0; array[i]; i++ ) {
					ret.push( array[i] );
				}
			}
		}

		return ret;
	};
}


То есть они проверяют не IE это или другой браузер, а возможность выполнить:
Array.prototype.slice.call( document.documentElement.childNodes );

Может ли это значить, что есть еще браузеры, кроме IE, которые будут выдавать ошибку при таком способе?

Kolyaj 23.12.2008 23:39

Проверять надо не браузер, а наличие доступной функции в нем.

Цитата:

Сообщение от Octane
Может ли это значить, что есть еще браузеры, кроме IE, которые будут выдавать ошибку при таком способе?

Это значит, что данный код будет работать в любом браузере, независимо от его UserAgent'а.


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