Pull to refresh

Comments 16

Как всегда отличный материал, спасибо!
Я не особо шарю в JS, но во втором примере разве не ошибка?

for (var i in a)
на
for (var i in obj)
И еще вот тут:
>Если функции Iterator передать второй аргумент…
var it = Iterator(langs); // нет второго аргумента
Пока вы читали я исправил. Второй аргумент нужен только для итерации ключей:
Если функции Iterator передать второй аргумент, то итерироваться будут только индексы
Года полтора назад я жутко завидовал этим магическим питоновским конструкциям.
Ждем…
Кстати, вроде как вызов obj.length ни чем не дольше чем брать значение переменной = obj.length
Обход массива значительно быстрее обхода массивообразного объекта. Если же список привести к массиву (Array.prototype.slice.call), то скорость обхода будет значительно больше.

Обход по скорости:
Array >>> Array from NodeList or HTMLCollection >>> NodeList >>> HTMLCollection

NodeList - querySelectorAll
HTMLCollection - getElementsByTagName
Добавил ещё 4 пары тестов смотрите тесты они опишут всю ситуацию лучше меня.
А выгодно ли приводить к массиву? Не сожжёт ли приведение весь выигрыш?
Тесты тестами — каждый раз надо смотреть конкретный случай. Если обходить коллекцию 1 раз, то перевод к массиву не эффективен >1 — нужно смотреть. Если приводить к массиву, а потом обходить, то обход будет медленнее или не изменится.
Если обход малого объема объектов, то без разницы как обходить с переводом к массиву или нет — в жизни важнее удобство. Прирост в 2 мсек ни на что не влияет.
Добавил 2 теста jsperf.com/eof-loop-cache/3
UFO just landed and posted this here
Кода получилось немного больше, но код вырос в ширину(это важный плюс)
Я бы не сказал, что это тот аргумент, который делает генераторы полезными.
Читать такой код не проще, вертикальное «сканирование» привычнее и быстрее,
да и в 1 строку можно писать те же самые циклы с условными операторами, если нравится.
Помоему, мы недопоняли друг друга. Код может расти либо в ширину/высоту либо в глубину. Если код растет в глубину (много вложенных циклов, много вложенных коллбэков) это плохо потому, что он перестает читаться. Генераторы способствуют росту в ширину и вносят декларативный стиль — весомый плюс к прочим достоинствам.
for (var i = 0, c = aList.length, a, content, domain; i < c; i++) {
    a = aList[i];
    content = a.innerHTML;
    domain = a.getAttribute('href').replace('http://', '').split('/').shift();
    if (content === domain) {
        console.log(domain);
    }
}

Зачем так сложно? Так попроще будет:
for (var i = 0, a; i < aList.length; i++) {
    a = aList[i];
    if (a.innerHTML === a.host) {
        console.log(a.host);
    }
}
Кроссбраузерно с jQuery

$.each(objOrArray, function(key, value){
    console.log(key, value);
});


или, если нужно только значение

$.each(objOrArray, function(){
    console.log(this);
});


обратите внимание, что не objOrArray.each(...), а именно так как написано выше

api.jquery.com/jQuery.each/
Sign up to leave a comment.

Articles