JavaScript for each statement

Днешния преглед на блоговете (в неделя сутринта обикновено няма новости) не се отличаваше с нищо интересно - поне на пръв поглед. Преглеждах набързо пост по една от болните теми - разширяването на вградени обекти, когато това изречение

This includes the for(i in o) and for each(i in o) iterators, …

Ме притесни. JavaScript има for each? Отворих scite и надрасках

var o = { a : 1, b : 2};
for each(i in o)
{
    alert(i);
}

Тръгна под Firefox 1.5.0.4 - i е стойността, а не ключа от обекта. Не работи под IE със синтактична грешка. Ясно, езиково “нововъведение” на мозилците.

Сега, тук идва по-трудното - да намериш информация за for each в Гугъл. След няколко неуспешни търсения (едното от които ме прати на доста интересен резултат) в крайна сметка мозилското wiki не ме предаде - for each statement е имплементиран в JavaScript 1.6. Това добре.

Kакво обаче е JavaScript 1.6 и откъде накъде Мозила имплементират разни работи по него? Според wikipedia (наред с многото глупости)

The previous version 1.6 corresponded to ECMA-262 Edition 3 like JavaScript 1.5, except for Array extras, and Array and String generics…

Пак според wikipedia третата ревизия на ECMAта е почти имплементирана от всички браузъри. Фор ийч обаче отсъства от IE; доколкото знам, и в IE 7 няма да има никакви нововъведения в тази насока. Сиреч for each в javascript засега ще остане нещо, което става само за Минута е много - знание без особена полза.

2 Коментара по “JavaScript for each statement”

  1. Алек:

    for (var i in o) {
    alert(o[i]);
    }

    Не е толкова красиво като for each, но раоти навсякъде.

  2. Петьо:

    Бих ползвал prototype ако става за въпрос - там имат приятна each циклия. Другото хубаво, което мозилците са имплементирали (и може да бъде направено за IE) е Array::forEach. Чиято имплементация би трябвало да изглежда горе долу така:

    if (!Array.prototype.forEach)
    {
    	Array.prototype.forEach = function (closure)
    	{
    		var context = arguments[1] || null;
    		for (var i = 0; i < this.length; i ++)
    		{
    			arguments[0].call(context, this[i], i, this);
    		}
    	}
    }
    	
    [1, 2, 3, 4].forEach(function (el){alert(el)})
    

Коментирай