У 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]);
}
Ответы
Ответ 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]);
}