Есть ли в Javascript расширенный синтаксис цикла for, похожий на Java? - PullRequest
21 голосов
/ 30 декабря 2011

Мне интересно, есть ли в JavaScript улучшенный синтаксис цикла for, который позволяет перебирать массивы.Например, в Java вы можете просто сделать следующее:

String[] array = "hello there my friend".split(" ");

for (String s : array){
    System.out.println(s);
}

вывод:

hello
there
my
friend

Есть ли способ сделать это в JavaScript?Или я должен использовать array.length и использовать стандартный для синтаксиса цикла, как показано ниже?

var array = "hello there my friend".split(" ");

for (i=0;i<array.length;i++){
    document.write(array[i]);
}

Ответы [ 7 ]

22 голосов
/ 30 декабря 2011

JavaScript имеет цикл foreach (for (x in a)), но использование кода на Array крайне плохая практика кодирования. В принципе, подход array.length является правильным. Существует также метод a.forEach(fn) в новых JavaScripts, который вы можете использовать, но он не гарантированно присутствует во всех браузерах - и он медленнее, чем array.length.

РЕДАКТИРОВАТЬ 2017 : «Посмотрим, как пойдет», действительно. В большинстве двигателей сейчас .forEach() теперь так же быстро или быстрее, чем for(;;), при условии, что функция встроена, т. Е. arr.forEach(function() { ... }) быстрая, foo = function() { ... }; arr.forEach(foo) может и не быть. Кто-то может подумать, что они должны быть идентичными, но первый компилятор легче оптимизировать, чем второй.

8 голосов
/ 30 декабря 2011

Используя последние версии JavaScript, доступные для большинства современных браузеров, вы можете сделать это:

array.forEach(function(x){
  document.write(x);
});

Подробности на https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach. Если вы беспокоитесь, что браузер может не поддерживатьдля этого вы можете добавить его самостоятельно, используя (мы надеемся, минимизированную) версию реализации, которую они перечислили в разделе «Совместимость».

Это немного устарело, но это версия минимизированной совместимости forEach что я получил от страницы Mozilla несколько лет назад:

if(!Array.prototype.forEach){Array.prototype.forEach=function(b){if(typeof b!="function"){throw new TypeError()}var a=this.length,d=arguments[1],c;for(c=0;c<a;c++){if(c in this){b.call(d,this[c],c,this)}}}};

У меня никогда не возникало никаких проблем с этим, но реализация на странице Mozilla была расширена с некоторыми дополнительными проверками и кодом, чтобы сделатьон совместим с ECMA-262, издание 5, 15.4.4.18.

У меня есть файл с именем common.js, который я использую и включаю на всех своих страницах, чтобы включить это, а также все остальные "Массив дополнений ", которые были представлены в JavaScript 1.6, как указано в https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6#Array_extras. (я хотел получить это обновление и опубликовать для публичного использования.)

Этоможет быть не самый быстрый подход (см. http://jsperf.com/for-vs-foreach/15 для некоторых особенностей - спасибо за ссылку, Amadan) - но есть что-то, чтобы сказать для краткости и удобства обслуживания и т. д. Кроме того, будет очень интересно посмотретьсколько из этого несоответствия оптимизировано дальнейшими улучшениями движка JavaScript в течение следующих нескольких месяцев и лет.: -)

3 голосов
/ 04 мая 2017

В ES2015 (ES6) вы можете использовать цикл for-of.Он поддерживается в большинстве браузеров, за исключением IE.

let array = [10, 20, 30];

for (let value of array) {
  console.log(value);
}

См. Объяснение Mozilla здесь

3 голосов
/ 30 декабря 2011

Вы можете сделать for(s in array), но будьте осторожны, это не то же самое, что foreach.

В этом случае s - это ключ (индекс), а не значение. Вам также необходимо использовать hasOwnProperty, потому что in зацикливается, хотя объект prototype также.

for(s in array){
    if(array.hasOwnProperty(s)){
        console.log(array[s]);
    }
}

РЕДАКТИРОВАТЬ: Как указал @Amadan, hasOwnProperty выполняет итерации свойств, когда они добавляются следующим образом: array.test = function(){}. Я предлагаю , а не , используя for...in.

EDIT2: Если вы используете современный веб-браузер (все, что не IE <9), вы можете использовать <code>Array.forEach). @ziesemer указывает, что Mozilla имеет шим для этого, если вам нужна поддержка IE <9. </p>

array.forEach(function(s){
    console.log(s);
});

ПРИМЕЧАНИЕ. Лично я использую jQuery для своих проектов JavaScript и использую $.each.

$.each(array, function(i,s){
    console.log(s);
});
2 голосов
/ 30 декабря 2011

В прототипе Array в более новых движках JavaScript есть метод forEach.Некоторые библиотеки сами расширяют прототип похожим способом.

1 голос
/ 02 октября 2017

Попробуйте,

 var errorList = new Array();
       errorList.push("e1");
       errorList.push("e2");

       for (var indx in errorList){
               alert(errorList[indx]);
          }
1 голос
/ 30 декабря 2011
x = [1,2,3];
for (i in x) {
  console.log(i);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...