true - Javascript while loop con función como condicional
while example (3)
Acerca de por qué while (a = next()) {/*do something*/}
no se repite infinitamente, se trata de ser forzado a falso que cuenta - los argumentos se convierten en booleanos antes de ser probados por el ciclo while. Las cosas que coaccionan a falso incluyen 0
, -0
, undefined
, null
, ""
, NaN
, y por supuesto false
sí mismo.
Cuando asigna algo, devuelve el valor de la tarea en sí. Por ejemplo, si haces algo como esto:
var a;
console.log(a = ''1234567890abcdefghijklmnopqrstuvwxyz'');
Se registrará 1234567890abcdefghijklmnopqrstuvwxyz
.
Cuando el next
realiza el index++
, esto incrementa el contador para el índice del elemento en el conjunto de data
. Esto significa que buscará el siguiente elemento en la matriz de datos cada vez que ejecute la función next()
; si no hay más elementos, regresará undefined
y, por lo tanto, finalizará el ciclo.
Por ejemplo, mira esto:
var index = 0;
data = [''a'',''b'',''c''];
data[index]; // ''a''
index++;
data[index]; // ''b''
index++;
data[index]; // ''c''
index++;
data[index]; // undefined - if passed this will coerce to false and end the loop
Boolean(data[index]); // false
Según entiendo, el contenido de un ciclo while se ejecuta mientras la condición es verdadera. Mientras trabajaba con un ejemplo de un impresionante libro de O''Riely, me encontré con esta implementación del ciclo while ...
window.onload = function(){
var next, previous, rewind; // globals
(function(){
// Set private variables
var index = -1;
var data = [''eeny'', ''meeny'', ''miney'', ''moe''];
var count = data.length;
next = function(){
if (index < count) {
index ++;
};
return data[index];
};
previous = function(){
if (index <= count){
index --;
}
return data[index];
};
rewind = function(){
index = -1;
};
})();
// console.log results of while loop calling next()...
var a;
rewind();
while(a = next()){
// do something here
console.log(a);
}
}
Supongo que me pregunto por qué, en este código, el ciclo while no se está resolviendo como verdadero infinitamente. La función, next () no devuelve falso después de que el índice var deja de incrementarse (++), ¿o sí? ¿No debería la consola solo emitir eeny, meeny, miney, moe, moe, moe, moe ... etc ...?
Sé que esto probablemente se ha preguntado de alguna forma, pero he hecho la búsqueda y no puedo encontrar una pregunta o respuesta que explique el uso de while (a = function()) {// do something}
y cómo este ciclo se detiene después de un pase a través de la matriz.
No,
No va a ser un ciclo infinito. El ciclo while básicamente pasa por la matriz y lo emite, y cuando está al final de la matriz simplemente devuelve falso y abandona el ciclo.
Esto es algo así como;
foreach(a as nextArray)
{
//output
}
Espero que esto ayude.
if (index < count) {
index ++;
};
Cuando el index
es count - 1
, esto aún cambiará el index
para count
, ¿verdad? Y el count
es data.length
. Entonces, entonces hace esto:
return data[index];
Que se convierte
return data[data.length];
Como la longitud de una matriz está fuera de los límites de la matriz (están basadas en cero), dará undefined
.
while(a = next()){
se convertirá
while(a = undefined){
Como undefined
es un valor falso, el ciclo no se ingresará.