Comments 16
Как всегда отличный материал, спасибо!
+2
Я не особо шарю в JS, но во втором примере разве не ошибка?
на
for (var i in a)
на
for (var i in obj)
+1
Года полтора назад я жутко завидовал этим магическим питоновским конструкциям.
Ждем…
Ждем…
+2
Кстати, вроде как вызов obj.length ни чем не дольше чем брать значение переменной = obj.length
+3
Привычка из прошлого. Сейчас почти все браузеры научились оптимизировать циклы
0
А что с живыми коллекциями?
+1
Обход массива значительно быстрее обхода массивообразного объекта. Если же список привести к массиву (
Обход по скорости:
Array.prototype.slice.call
), то скорость обхода будет значительно больше. Обход по скорости:
Array >>> Array from NodeList or HTMLCollection >>> NodeList >>> HTMLCollection
NodeList - querySelectorAll
HTMLCollection - getElementsByTagName
Добавил ещё 4 пары тестов смотрите тесты они опишут всю ситуацию лучше меня. +1
А выгодно ли приводить к массиву? Не сожжёт ли приведение весь выигрыш?
0
Тесты тестами — каждый раз надо смотреть конкретный случай. Если обходить коллекцию 1 раз, то перевод к массиву не эффективен >1 — нужно смотреть. Если приводить к массиву, а потом обходить, то обход будет медленнее или не изменится.
Если обход малого объема объектов, то без разницы как обходить с переводом к массиву или нет — в жизни важнее удобство. Прирост в 2 мсек ни на что не влияет.
Добавил 2 теста jsperf.com/eof-loop-cache/3
Если обход малого объема объектов, то без разницы как обходить с переводом к массиву или нет — в жизни важнее удобство. Прирост в 2 мсек ни на что не влияет.
Добавил 2 теста jsperf.com/eof-loop-cache/3
0
UFO just landed and posted this here
Кода получилось немного больше, но код вырос в ширину(это важный плюс)
Я бы не сказал, что это тот аргумент, который делает генераторы полезными.
Читать такой код не проще, вертикальное «сканирование» привычнее и быстрее,
да и в 1 строку можно писать те же самые циклы с условными операторами, если нравится.
Я бы не сказал, что это тот аргумент, который делает генераторы полезными.
Читать такой код не проще, вертикальное «сканирование» привычнее и быстрее,
да и в 1 строку можно писать те же самые циклы с условными операторами, если нравится.
0
Помоему, мы недопоняли друг друга. Код может расти либо в ширину/высоту либо в глубину. Если код растет в глубину (много вложенных циклов, много вложенных коллбэков) это плохо потому, что он перестает читаться. Генераторы способствуют росту в ширину и вносят декларативный стиль — весомый плюс к прочим достоинствам.
0
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);
}
}
0
Кроссбраузерно с jQuery
или, если нужно только значение
обратите внимание, что не objOrArray.each(...), а именно так как написано выше
api.jquery.com/jQuery.each/
$.each(objOrArray, function(key, value){
console.log(key, value);
});
или, если нужно только значение
$.each(objOrArray, function(){
console.log(this);
});
обратите внимание, что не objOrArray.each(...), а именно так как написано выше
api.jquery.com/jQuery.each/
0
Sign up to leave a comment.
Iterators & Generators