 
			
				26.12.2013, 15:20
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.02.2013 
					
					
					
						Сообщений: 13
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				почему вместо методов Array используют циклы
			 
			
		
		
		
		постоянно вижу как для перебора массива используют циклы,  
хотя такие методы как: forEach, reduce и т.д., 
по моему мнению, использовать гораздо удобней.  
так почему же их игнорируют? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				26.12.2013, 15:24
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				26.12.2013, 22:05
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 CacheVar 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 19.08.2010 
					
					
					
						Сообщений: 14,298
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от finestra
			
		
	 | 
 
	| 
		по моему мнению, использовать гораздо удобней
	 | 
 
	
 
 А чем циклы-то провинились?    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
	
		
	
		
		
		
			
			 
			
				26.12.2013, 23:10
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.09.2010 
					
					
					
						Сообщений: 8,804
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Почему же. В тех же расширениях к браузерам можно запросто использовать эти методы. Или в коде для NodeJS. Ну и вобще, когда поддержка IE8 и других старых браузеров не нужна. Ну а если хочется, но нужна полная поддержка, то es5shim.js в помощь. 
		
	
		
		
		
		
		
			
				__________________ 
				В личку только с интересными предложениями   
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				27.12.2013, 02:54
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.11.2013 
					
					
					
						Сообщений: 42
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Почему-то был уверен, что forEach работает ощутимо медленнее за счет необходимости вызова функции на каждой итерации. Замерил (только в фаерфоксе). Удивился, но это не так. 
 
То есть цикл с действиями, выполняемыми инлайново, отрабатывает медленнее, чем forEach с вызовом функции (с теми же действиями) на каждый элемент массива. 
 
Похоже, что если нет проблем с поддержкой, то стоит отдавать предпочтение итерирующим методам. 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Antonius, 27.12.2013 в 03:04.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				27.12.2013, 03:33
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 I am Student 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 17.12.2011 
					
					
					
						Сообщений: 4,415
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
		
	
		
		
		
		
		
			
				__________________ 
				
	
 
	| 
		
			 Цитата: 
		
	 | 
 
	| 
		Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
	 | 
 
	
 
 
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				27.12.2013, 03:42
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.11.2013 
					
					
					
						Сообщений: 42
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Ага, любопытно. Сам тест у меня практически такой же, рассуждения верны, получается, а результаты неверны. Замерял в фаербаге console.time/timeEnd. 
 
Да, итерирующие методы работают медленно. Печаль, ибо код с ними гораздо опрятнее. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				27.12.2013, 05:38
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 I am Student 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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>
 
		
	
		
		
		
		
		
			
				__________________ 
				
	
 
	| 
		
			 Цитата: 
		
	 | 
 
	| 
		Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
	 | 
 
	
 
 
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				27.12.2013, 05:49
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 30.11.2013 
					
					
					
						Сообщений: 42
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 А есть какое-то общее правило, которое может помочь определить, когда forEach не будет сильно уступать циклу? 
 
Я для себя пока склоняюсь к подходу «использовать forEach тогда, когда внутри цикла мы делали бы вызов функции» 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |