Как стать автором
Обновить

Комментарии 57

Можете предложить свои функции в этот файл :)
Push и pop. IE 5 их не понимает.
Вы действительно еще ориентируетесь на IE 5?

Разработчики из Mozilla уже нет.
знаете.. я работаю в компании, в которой кроме 200 человек департамента IТ работает порядка 20тыс "простых" смертных... и, к нашему айтишному сожалению :((( юзают все ИЕ... и за корпоративный стандарт его также приняли, к сожалению((

это не возражение против вашего поста. скорее, сетование на ситуацию.. надеюсь, что время глобальных доминаций когда-нибудь закончится.
Я не против IE, но именно пятую версию не беру в расчет.
IE 5, вроде, даже MS уже не поддерживает..
А я против того что почти 40% рунета все еще пользуются IE 6 (fronter'ы меня понимают ))
IE5 давно не поддерживается, ты прав.

Да, понимаю :)
40% IE6? тогдаIE7 юзают больше 40%. А какже остальные? я что-то сомневаюсь, что меньше 20% ))
НЛО прилетело и опубликовало эту надпись здесь
в mootools всё это есть. :)
Во многих библиотеках есть это. Но надо знать и о встроенных возможностях. Они шустрее и правильнее.
в mootools и исползуются встроенные функции, если они доступны.
по поводу шустрее был где-то пост, точка была поставлена в том месте, что фреймверк против чистого js проигрывает только если вы пользуетесь массивами по несколько тысяч элементов или делаете множество переборов по циклам (допустим 3 x 200, те 200 в кубе итераций), что для решения типичных задач по сути не идет в расчет. По поводу правильнее — спорно, фреймверки не меняют идеологию, сокращают код(а значит и место для ошибок), в любом из языков програмирования мы же применяем фреймверк или пытаемся "обвернуть" части в некоторые абстракции для облегчения разработки(и жизни :) ), имхо — js — не исключение.

зы: ничего личного, сам раньше приветствовал чистый js и свой набор функций, но потом разобрался в prototype, mootools, Saculos, jquery... и теперь уже и забыл в каком из проектов последний раз применил чистый js с тем самым армейским набором функций.

Array.prototype.fill=function(val){for (var i=0;i<this.length;++i) this[i]=val}

a=[1,2,3]
a.fill(4)
Мне сложно представить как может быть полезна эта функция :)
А вот разработчикам руби это представить удалось.
А, понял.
Но пример вы привели плохой.

var a = new Array(10);
a.fill(4);
Мило :)
больше всего радует foreach :)
jQuery станет еще быстрей... радует.
Вообще-то 1.6 это не очень свежая новость. Рассказали бы про 1.7, генераторы да итераторы, да Array comprehensions, наподобие

newArray = [i+1 for each (i in existingArray)]
Далеко не свежая. Но изучив кучу JS разных проектов и библиотек я пришел к выводу, что для многих это будет не просто новость, а открытие.
Разные проекты и библиотеки принуждены ориентироваться на сами-знаете-какой броузер, который поддерживает ECMA 262 v.3, то есть примерно Яваскрипт 1.5.

С моей точки зрения, лучше всего расслабиться до появления ECMA-262 v.4, потому как до этого момента сами-знаете-какая компания и не подумает чесаться. Какое им дело до того, что в Мозилле делают.
Статья кроссброузерна. Правда, как заметили выше, не работает в IE версии 5 :))
А новые конструкции языка надо знать, но в данный момент нет смысла изучать.
Функции хотя бы можно дописать и обеспечить совместимость, а с языковыми конструкциями это не пройдет.
> forEach
А чем for in не катит? Остальное — производное.
Приведенные функции - в основном для lambda-выражений.

Разницу, надеюсь, понимаете.
Никогда не используйте for in для массивов!
JavaScript начинает смахивать на Руби :)

myArray.forEach(function(item){...})
<=>
my_array.each do |item| ...; end
Это стандартный прием для всех современных языков программирования.
когда знаешь только руби, то и конструкции похожи именно на руби ;)
А такие бывают?:)
Я думаю, он про блоки говорит, а не про foreach loop. ;-)
да, я про лямбда функции.
Я тоже :-)
Это называется функции высшего порядка. map, filter, fold — самые известные из них. Тут нет fold (также известной как свёртка). some является частным случаем fold с жёстко заданной комбинирующей функцией.
Ех... а вот в JS 1.8, как раз есть array.reduce() и array.reduceRight() аналог вашей fold - поддерживается в Gecko 1.9a5 и старше.
Да и some() не является частным случаем fold, так как возвращает true если хотя бы для одного элемента массива функция возвращает true и false противном случае.
Почему же? Это fold с комбинирующей функцией or (логическое или).
потому что..
используем some
a = [1,2,3,4,5];
console.log(a.some(function(v, i, ar){ ar[i] = 1; return v == 3 }));
console.log(a);

используем reduce
a = [1,2,3,4,5];
console.log(a.reduce(function(p, c, i, ar){ ar[i] = 1; return с == 3 }, false));
console.log(a);

или как вы хотели - частный случай
a = [1,2,3,4,5];
console.log(a.reduce(function(p, c, i, ar){ ar[i] = 1; return p || (c == 3) }, false));
console.log(a);

Разница как минимум одна - reduce проходит ВЕСЬ массив, в то время как some только до первого true, или весь массив если true так и не найдено.
К тому же если в случае с some мы оперируем всегда только с текущим значением, то в случае с reduce нам доступен результат предыдущего вычисления или initValue. По сути же функции имею разное предназначение. Some узнать если ли нужное значение в массиве, а reduce сворачивание массива в скалярное значение.
Да, спасибо. Действительно, не совсем правильно понял. some — это как memp, только возвращает булево значение ;)
А что мешает самому в прототипе дописать эти функции? Почему выделен именно Mozilla, вроде бы многие дописывают? Или я ошибаюсь?
Дочитайте статью до конца. Там файл, где в прототипе все это прописано для совместимости с остальными версиями JS.
Давайте признаемся, что речь идёт не о совместимости, а об эмуляции.

Не очень-то охота писать
myArray.forEach( function(item){ alert(item); } );

вместо просто

myArray.forEach( alert );
Потому что итеративные методы с замыканиями (closures) в 1.6 реализованые именно так, а то, что у вас в статье — это ручное расширение через прототипы.
Справедливый комментарий :)
Что-то я не понял, что мешает написать myArray.forEach( alert );
Лишь то, что это будет работать только в Мозилле, и более нигде.
Еще в Опере начиная с 9ой версии, но это так, к слову :)
Заметил, что принцип подхода к обработке массива данных схож с языком функционального программирования Haskell
И не случайно, посколько именно из хаскела списковые включения (list comprehension) перекочевали в питон, и уже оттуда были позаимствованы яваскриптом, где их уже прозвали массивными включениями (array comprehension), за недостачей спискового типа данных в js.
Это всего-навсего функции высшего порядка. Они ещё в lisp были. См. [1]
Кстати многие вот пишут, что IE не поддерживает, так в IE и язык другой. JScript называется. Очень похож, но другой.
Microsoft. Like.no.other.
Как JScript, так и js соотетсвтвуют стандарту ECMAScript. Только мозилла не ждёт, а выпускает новые версии. А для м-софта это не базовый продукт, у них ActiveScript есть, и поэтому они обоснованно ждут обновления стандарта.
MS тоже никого не ждет. Для .Net есть своя версия JS.
к сожелению NodeSet, ArgumentsList и прочие списки не являются в яваскрипте массивами =( так что в общем случае нужно либо писать специальный враппер, либо специальную функцию, которая будет выдавать массив по входному объекту.
в первом случае нужно внимательно следить за тем куда ты передаёшь враппер, а куда сырец. во втором - лишняя итерация по всему списку + потеря дополнительных данных (arguments.callee например)
Стоит отметить, что
[].every(function(e) { return false; }) // true
[].some(function(e) { return true; }) // false
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории