У Javascript есть расширенный синтаксис цикла, аналогичный Java - программирование
Подтвердить что ты не робот

У Javascript есть расширенный синтаксис цикла, аналогичный Java

Мне интересно, имеет ли JavaScript расширенный синтаксис цикла, который позволяет вам перебирать массивы. Например, в 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]);
}
4b9b3361

Ответ 1

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

EDIT 2017: "Посмотрим, как это получится". В большинстве движков теперь .forEach() теперь работает так же быстро или быстрее, чем for(;;), если функция встроена, т.е. arr.forEach(function() { ... }) работает быстро, foo = function() { ... }; arr.forEach(foo) может и не быть. Можно подумать, что эти два должны быть одинаковыми, но первый проще для компилятора оптимизировать, чем второй.

Ответ 2

Используя самые последние версии 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, Edition 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

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

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

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

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

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

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

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

$.each(array, function(i,s){
    console.log(s);
});

Ответ 4

В методе Array используется метод "forEach" в прототипе Array. В некоторых библиотеках этот прототип расширяет аналогичный метод.

Ответ 5

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

let array = [10, 20, 30];

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

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

Ответ 6

x = [1,2,3];
for (i in x) {
  console.log(i);
}

Ответ 7

Попробуйте это,

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

       for (var indx in errorList){
               alert(errorList[indx]);
          }