Szukaj…
Składnia
- for ( inicjalizacja ; warunek ; wyrażenie_wyrażeniowe ) {}
- dla ( klucz w obiekcie ) {}
- dla ( zmienna iterowalna ) {}
- while ( warunek ) {}
- do {} while ( warunek )
- dla każdego ( zmienna w obiekcie ) {} // ECMAScript for XML
Uwagi
Pętle w JavaScript zazwyczaj pomagają w rozwiązywaniu problemów związanych z powtarzaniem określonego kodu x razy. Powiedz, że musisz zalogować wiadomość 5 razy. Możesz to zrobić:
console.log("a message");
console.log("a message");
console.log("a message");
console.log("a message");
console.log("a message");
Ale to tylko czasochłonne i trochę śmieszne. A co jeśli trzeba zalogować ponad 300 wiadomości? Powinieneś zastąpić kod tradycyjną pętlą „for”:
for(var i = 0; i < 5; i++){
console.log("a message");
}
Standardowe pętle „for”
Standardowe użycie
for (var i = 0; i < 100; i++) {
console.log(i);
}
Oczekiwany wynik:
0
1
...
99
Wiele deklaracji
Powszechnie używane do buforowania długości tablicy.
var array = ['a', 'b', 'c'];
for (var i = 0; i < array.length; i++) {
console.log(array[i]);
}
Oczekiwany wynik:
'za'
'b'
'do'
Zmiana przyrostu
for (var i = 0; i < 100; i += 2 /* Can also be: i = i + 2 */) {
console.log(i);
}
Oczekiwany wynik:
0
2)
4
...
98
Zmniejszona pętla
for (var i = 100; i >=0; i--) {
console.log(i);
}
Oczekiwany wynik:
100
99
98
...
0
„while” Loops
Standardowa pętla While
Standardowa pętla while będzie wykonywana, dopóki podany warunek nie będzie fałszywy:
var i = 0;
while (i < 100) {
console.log(i);
i++;
}
Oczekiwany wynik:
0
1
...
99
Zmniejszona pętla
var i = 100;
while (i > 0) {
console.log(i);
i--; /* equivalent to i=i-1 */
}
Oczekiwany wynik:
100
99
98
...
1
Czy ... podczas Loop
Pętla do ... while będzie zawsze wykonywana co najmniej raz, niezależnie od tego, czy warunek jest prawdziwy, czy fałszywy:
var i = 101;
do {
console.log(i);
} while (i < 100);
Oczekiwany wynik:
101
„Break” z pętli
Wyjście z pętli while
var i = 0;
while(true) {
i++;
if(i === 42) {
break;
}
}
console.log(i);
Oczekiwany wynik:
42
Wyjście z pętli for
var i;
for(i = 0; i < 100; i++) {
if(i === 42) {
break;
}
}
console.log(i);
Oczekiwany wynik:
42
„kontynuuj” pętlę
Kontynuacja pętli „za”
Po umieszczeniu słowa kluczowego continue
w pętli for wykonanie wykonuje skok do wyrażenia aktualizacji (w tym przykładzie i++
):
for (var i = 0; i < 3; i++) {
if (i === 1) {
continue;
}
console.log(i);
}
Oczekiwany wynik:
0
2)
Kontynuacja pętli While
Podczas continue
w pętli while wykonanie continue
do warunku ( i < 3
w przykładzie):
var i = 0;
while (i < 3) {
if (i === 1) {
i = 2;
continue;
}
console.log(i);
i++;
}
Oczekiwany wynik:
0
2)
Pętla „do ... while”
var availableName;
do {
availableName = getRandomName();
} while (isNameUsed(name));
do while
pętla jest gwarantowana do pracy co najmniej raz, jak jest to warunek jest sprawdzany tylko na koniec iteracji. Tradycyjna while
pętla może uruchomić zero lub więcej razy jako jej warunek jest sprawdzany na początku iteracji.
Przerwij określone zagnieżdżone pętle
Możemy nazwać nasze pętle i w razie potrzeby przerwać konkretną.
outerloop:
for (var i = 0;i<3;i++){
innerloup:
for (var j = 0;j <3; j++){
console.log(i);
console.log(j);
if (j == 1){
break outerloop;
}
}
}
Wynik:
0
0
0
1
Rozbij i kontynuuj etykiety
Po instrukcjach Break i Continue może następować opcjonalna etykieta, która działa jak pewnego rodzaju instrukcja goto, wznawia wykonywanie od pozycji, do której odnosi się etykieta
for(var i = 0; i < 5; i++){
nextLoop2Iteration:
for(var j = 0; j < 5; j++){
if(i == j) break nextLoop2Iteration;
console.log(i, j);
}
}
i = 0 j = 0 pomija pozostałe wartości j
1 0
i = 1 j = 1 pomija pozostałe wartości j
2 0
2 1 i = 2 j = 2 pomija pozostałe wartości j
3 0
3 1
3 2
i = 3 j = 3 pomija pozostałe wartości j
4 0
4 1
4 2
4 3
i = 4 j = 4 nie rejestruje się i pętle są zakończone
pętla „for… of”
const iterable = [0, 1, 2];
for (let i of iterable) {
console.log(i);
}
Oczekiwany wynik:
0
1
2)
Zalety pętli for ... to:
- Jest to jak dotąd najbardziej zwięzła, bezpośrednia składnia do zapętlania elementów tablicy
- Pozwala uniknąć pułapek dla ... w
- W przeciwieństwie do
forEach()
, działa z break, kontynuuj i return
Wsparcie dla ... z innych kolekcji
Smyczki
for ... of potraktuje ciąg jako ciąg znaków Unicode:
const string = "abc";
for (let chr of string) {
console.log(chr);
}
Oczekiwany wynik:
a b c
Zestawy
do ... prac na obiektach Set .
Uwaga :
- Obiekt Set wyeliminuje duplikaty.
- Sprawdź to odniesienie dla obsługi przeglądarki
Set()
.
const names = ['bob', 'alejandro', 'zandra', 'anna', 'bob'];
const uniqueNames = new Set(names);
for (let name of uniqueNames) {
console.log(name);
}
Oczekiwany wynik:
kok
alejandro
zandra
Ania
Mapy
Można również użyć do ... pętle iteracyjne nad Mapa s. Działa to podobnie do tablic i zestawów, z tą różnicą, że zmienna iteracyjna przechowuje zarówno klucz, jak i wartość.
const map = new Map()
.set('abc', 1)
.set('def', 2)
for (const iteration of map) {
console.log(iteration) //will log ['abc', 1] and then ['def', 2]
}
Możesz użyć przypisania destrukcyjnego do przechwycenia klucza i wartości osobno:
const map = new Map()
.set('abc', 1)
.set('def', 2)
for (const [key, value] of map) {
console.log(key + ' is mapped to ' + value)
}
/*Logs:
abc is mapped to 1
def is mapped to 2
*/
Obiekty
dla ... pętli nie działają bezpośrednio na zwykłych Obiektach; ale możliwe jest iterowanie właściwości obiektu, przechodząc do pętli for ... in lub używając Object.keys()
:
const someObject = { name: 'Mike' };
for (let key of Object.keys(someObject)) {
console.log(key + ": " + someObject[key]);
}
Oczekiwany wynik:
imię: Mike
Pętla „za… w”
Ostrzeżenie
for ... in jest przeznaczony do iteracji po kluczach obiektowych, a nie indeksach tablic. Używanie go do przechodzenia przez tablicę jest ogólnie odradzane . Zawiera także właściwości z prototypu, więc może być konieczne sprawdzenie, czy klucz znajduje się w obiekcie za pomocąhasOwnProperty
. Jeśli jakiekolwiek atrybuty w obiekcie zostaną zdefiniowane za pomocą metodydefineProperty/defineProperties
i ustawiono parametrdefineProperty/defineProperties
enumerable: false
, atrybuty te będą niedostępne.
var object = {"a":"foo", "b":"bar", "c":"baz"};
// `a` is inaccessible
Object.defineProperty(object , 'a', {
enumerable: false,
});
for (var key in object) {
if (object.hasOwnProperty(key)) {
console.log('object.' + key + ', ' + object[key]);
}
}
Oczekiwany wynik:
object.b, bar
object.c, baz