Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.12.2013, 15:20
Интересующийся
Отправить личное сообщение для finestra Посмотреть профиль Найти все сообщения от finestra
 
Регистрация: 28.02.2013
Сообщений: 13

почему вместо методов Array используют циклы
постоянно вижу как для перебора массива используют циклы,
хотя такие методы как: forEach, reduce и т.д.,
по моему мнению, использовать гораздо удобней.
так почему же их игнорируют?
Ответить с цитированием
  #2 (permalink)  
Старый 26.12.2013, 15:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

finestra,
если ненужна поддержка старых браузеров
http://kangax.github.io/es5-compat-t...totype.forEach
Ответить с цитированием
  #3 (permalink)  
Старый 26.12.2013, 22:05
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от finestra
по моему мнению, использовать гораздо удобней
А чем циклы-то провинились?
Ответить с цитированием
  #4 (permalink)  
Старый 26.12.2013, 22:14
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Потому, что можно искать быстрее
Перебор массива - вложенный цикл
Ответить с цитированием
  #5 (permalink)  
Старый 26.12.2013, 23:10
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Почему же. В тех же расширениях к браузерам можно запросто использовать эти методы. Или в коде для NodeJS. Ну и вобще, когда поддержка IE8 и других старых браузеров не нужна. Ну а если хочется, но нужна полная поддержка, то es5shim.js в помощь.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 27.12.2013, 02:54
Аспирант
Отправить личное сообщение для Antonius Посмотреть профиль Найти все сообщения от Antonius
 
Регистрация: 30.11.2013
Сообщений: 42

Почему-то был уверен, что forEach работает ощутимо медленнее за счет необходимости вызова функции на каждой итерации. Замерил (только в фаерфоксе). Удивился, но это не так.

То есть цикл с действиями, выполняемыми инлайново, отрабатывает медленнее, чем forEach с вызовом функции (с теми же действиями) на каждый элемент массива.

Похоже, что если нет проблем с поддержкой, то стоит отдавать предпочтение итерирующим методам.

Последний раз редактировалось Antonius, 27.12.2013 в 03:04.
Ответить с цитированием
  #7 (permalink)  
Старый 27.12.2013, 03:33
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Antonius, http://jsperf.com/for-vs-foreach/111
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #8 (permalink)  
Старый 27.12.2013, 03:42
Аспирант
Отправить личное сообщение для Antonius Посмотреть профиль Найти все сообщения от Antonius
 
Регистрация: 30.11.2013
Сообщений: 42

Ага, любопытно. Сам тест у меня практически такой же, рассуждения верны, получается, а результаты неверны. Замерял в фаербаге console.time/timeEnd.

Да, итерирующие методы работают медленно. Печаль, ибо код с ними гораздо опрятнее.
Ответить с цитированием
  #9 (permalink)  
Старый 27.12.2013, 05:38
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Antonius, по сути можно использовать forEach там где не критична производительность, и forEach не всегда медлнее.

Сообщение от Antonius
Замерял в фаербаге console.time/timeEnd.
Нужно замерять не один раз, а много и выводить среднее значение по времени, и нагружать как можно больше, вот к примеру асинхронный тест который не вешает браузер и синхронный (браузер подвисает) http://jsfiddle.net/2pZ3T/1/

<input id="start" type="button" value="start test" >
<script>
var divs = [];

function domGenerate() {
  var container = document.createDocumentFragment();
    
    for(var i = 0; i < 1000; i++) {
      var div = document.createElement("div");
          div.innerHTML = i;
        
      divs.push(div);
      container.appendChild(div);
    }
    
    document.body.appendChild(container);
}

domGenerate();

function domClearFor() {
    for(var i = 0; i < divs.length; i++)
        divs[i].parentNode.removeChild(divs[i]);

    divs = [];
    domGenerate();
}

function domClearForEach() {
    divs.forEach(function (item) {
         item.parentNode.removeChild(item);  
    });
    
    divs = [];
    domGenerate();
}


function test(fnc, count, callback) {
    var time = 0, i = 0, d;
    
    (function runTest() {       
      
        if(i++ == count) {
            callback(time / count);
            return;
        }
        
      d = new Date;
      fnc();
      time += new Date - d;
    
      setTimeout(runTest, 0);
    }());
}

function testSync(fnc, count, callback) {
    var time = 0, d;
    
    for(var i = 0; i < count; i++){
     
        d = new Date;
        fnc();
        time += new Date - d;
    }
    
    callback && callback(time / count);
    return time / count;

};
document.getElementById("start").onclick = function () {

    console.log("test running...");
    this.value = "test running...";

    test(domClearFor, 1000, function (time) {// асинхронный test
     console.log("for", time);
    });

    test(domClearForEach, 1000, function (time) {
     console.log("forEach", time);
    });
    
};
</script>
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #10 (permalink)  
Старый 27.12.2013, 05:49
Аспирант
Отправить личное сообщение для Antonius Посмотреть профиль Найти все сообщения от Antonius
 
Регистрация: 30.11.2013
Сообщений: 42

А есть какое-то общее правило, которое может помочь определить, когда forEach не будет сильно уступать циклу?

Я для себя пока склоняюсь к подходу «использовать forEach тогда, когда внутри цикла мы делали бы вызов функции»
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Результать на ajax запрос какаято ерунда, вместо текста, почему? aRpi Общие вопросы Javascript 1 18.04.2011 13:13
Многомерный массив в json Л_Денис Общие вопросы Javascript 1 21.04.2010 21:43