Buscar..
Sintaxis
- para ( inicialización ; condición ; expresión_final ) {}
- para ( clave en objeto ) {}
- para ( variable de iterable ) {}
- while ( condición ) {}
- do {} while ( condicion )
- para cada ( variable en objeto ) {} // ECMAScript para XML
Observaciones
Los bucles en JavaScript generalmente ayudan a resolver problemas que involucran la repetición de un código específico x cantidad de veces. Digamos que necesitas registrar un mensaje 5 veces. Podrías hacer esto:
console.log("a message");
console.log("a message");
console.log("a message");
console.log("a message");
console.log("a message");
Pero eso solo consume mucho tiempo y es algo ridículo. Además, ¿qué sucede si necesita registrar más de 300 mensajes? Debe reemplazar el código con un bucle tradicional "for":
for(var i = 0; i < 5; i++){
console.log("a message");
}
Bucles estándar "para"
Uso estándar
for (var i = 0; i < 100; i++) {
console.log(i);
}
Rendimiento esperado:
0
1
...
99
Declaraciones multiples
Normalmente se utiliza para almacenar en caché la longitud de una matriz.
var array = ['a', 'b', 'c'];
for (var i = 0; i < array.length; i++) {
console.log(array[i]);
}
Rendimiento esperado:
'una'
'segundo'
'do'
Cambiando el incremento
for (var i = 0; i < 100; i += 2 /* Can also be: i = i + 2 */) {
console.log(i);
}
Rendimiento esperado:
0
2
4
...
98
Bucle decrementado
for (var i = 100; i >=0; i--) {
console.log(i);
}
Rendimiento esperado:
100
99
98
...
0
"while" bucles
Standard While Loop
Un bucle while estándar se ejecutará hasta que la condición dada sea falsa:
var i = 0;
while (i < 100) {
console.log(i);
i++;
}
Rendimiento esperado:
0
1
...
99
Bucle decrementado
var i = 100;
while (i > 0) {
console.log(i);
i--; /* equivalent to i=i-1 */
}
Rendimiento esperado:
100
99
98
...
1
Hacer ... mientras bucle
Un bucle do ... while siempre se ejecutará al menos una vez, independientemente de si la condición es verdadera o falsa:
var i = 101;
do {
console.log(i);
} while (i < 100);
Rendimiento esperado:
101
"Romper" fuera de un bucle
Saliendo de un bucle mientras
var i = 0;
while(true) {
i++;
if(i === 42) {
break;
}
}
console.log(i);
Rendimiento esperado:
42
Salir de un bucle for
var i;
for(i = 0; i < 100; i++) {
if(i === 42) {
break;
}
}
console.log(i);
Rendimiento esperado:
42
"continuar" un bucle
Continuando con un bucle "for"
Cuando coloca la palabra clave continue
en un bucle for, la ejecución salta a la expresión de actualización ( i++
en el ejemplo):
for (var i = 0; i < 3; i++) {
if (i === 1) {
continue;
}
console.log(i);
}
Rendimiento esperado:
0
2
Continuando un bucle While
Cuando continue
en un bucle while, la ejecución salta a la condición ( i < 3
en el ejemplo):
var i = 0;
while (i < 3) {
if (i === 1) {
i = 2;
continue;
}
console.log(i);
i++;
}
Rendimiento esperado:
0
2
"do ... while" loop
var availableName;
do {
availableName = getRandomName();
} while (isNameUsed(name));
Se garantiza do while
bucle do while
while se ejecute al menos una vez, ya que su condición solo se verifica al final de una iteración. Un bucle while
tradicional puede ejecutarse cero o más veces, ya que su condición se verifica al comienzo de una iteración.
Romper bucles anidados específicos
Podemos nombrar nuestros bucles y romper el específico cuando sea necesario.
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;
}
}
}
Salida:
0
0
0
1
Romper y continuar etiquetas
Las declaraciones de ruptura y continuación pueden ir seguidas de una etiqueta opcional que funciona como una especie de instrucción goto, que reanuda la ejecución desde la posición de la etiqueta referenciada.
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 salta el resto de los valores de j
1 0
i = 1 j = 1 salta el resto de los valores de j
2 0
2 1 i = 2 j = 2 salta el resto de los valores de j
3 0
3 1
3 2
i = 3 j = 3 salta el resto de los valores de j
4 0
4 1
4 2
4 3
i = 4 j = 4 no registra y se hacen los bucles
bucle "para ... de"
const iterable = [0, 1, 2];
for (let i of iterable) {
console.log(i);
}
Rendimiento esperado:
0
1
2
Las ventajas del for ... of loop son:
- Esta es la sintaxis directa más concisa para el bucle a través de elementos de matriz
- Evita todos los escollos de for ... in
- A diferencia de
forEach()
, funciona con break, continue y return
Soporte de para ... de en otras colecciones.
Instrumentos de cuerda
for ... of tratará una cadena como una secuencia de caracteres Unicode:
const string = "abc";
for (let chr of string) {
console.log(chr);
}
Rendimiento esperado:
a B C
Conjuntos
para ... de obras sobre objetos establecidos .
Nota :
- Un objeto Set eliminará duplicados.
- Por favor revise esta referencia para el soporte del navegador
Set()
.
const names = ['bob', 'alejandro', 'zandra', 'anna', 'bob'];
const uniqueNames = new Set(names);
for (let name of uniqueNames) {
console.log(name);
}
Rendimiento esperado:
mover
alejandro
zandra
anna
Mapas
También puede utilizar para ... de bucles para iterar sobre los mapas . Esto funciona de manera similar a matrices y conjuntos, excepto que la variable de iteración almacena tanto una clave como un valor.
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]
}
Puede usar la asignación de desestructuración para capturar la clave y el valor por separado:
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
*/
Objetos
para ... de bucles no funcionan directamente en objetos simples; pero, es posible iterar sobre las propiedades de un objeto cambiando a un bucle for ... in, o usando Object.keys()
:
const someObject = { name: 'Mike' };
for (let key of Object.keys(someObject)) {
console.log(key + ": " + someObject[key]);
}
Rendimiento esperado:
nombre: Mike
bucle "para ... en"
Advertencia
for ... in está pensado para iterar sobre claves de objeto, no índices de matriz. Se desaconseja generalmente usarlo para recorrer una matriz . También incluye propiedades del prototipo, por lo que puede ser necesario verificar si la clave está dentro del objeto usandohasOwnProperty
. Si el atributodefineProperty/defineProperties
define alguno de los atributos del objeto y establece el parámetroenumerable: false
, esos atributos serán inaccesibles.
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]);
}
}
Rendimiento esperado:
objeto.b, barra
object.c, baz