26.12.2013, 15:20
|
Интересующийся
|
|
Регистрация: 28.02.2013
Сообщений: 13
|
|
почему вместо методов Array используют циклы
постоянно вижу как для перебора массива используют циклы,
хотя такие методы как: forEach, reduce и т.д.,
по моему мнению, использовать гораздо удобней.
так почему же их игнорируют?
|
|
26.12.2013, 15:24
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
|
|
26.12.2013, 22:05
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,206
|
|
Сообщение от 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 тогда, когда внутри цикла мы делали бы вызов функции»
|
|
|
|