6.9 for/in
The
for
keyword
is used in two ways in JavaScript. We've just seen how it is
used in the for loop. It is also used in the
for/in statement. This statement is a somewhat
different kind of loop with the following syntax:
for (variable in object)
statement
variable should be either the name of a
variable, a var statement declaring a variable, an
element of an array, or a property of an object (i.e., it should be
something suitable as the leftthand side of an assignment
expression). object is the name of an
object or an expression that evaluates to an object. As usual,
statement is the statement or statement
block that forms the body of the loop.
You
can loop through the elements of an array by simply incrementing an
index variable each time through a while or
for loop. The for/in statement
provides a way to loop through the properties of an object. The body
of the for/in loop is executed once for each
property of object. Before the body of the
loop is executed, the name of one of the object's properties is
assigned to variable, as a string. Within
the body of the loop, you can use this variable to look up the value
of the object's property with the []
operator. For example, the following for/in loop
prints the name and value of each property of an object:
for (var prop in my_object) {
document.write("name: " + prop + "; value: " + my_object[prop], "<br>");
}
Note that the
variable in the
for/in loop may be an arbitrary expression, as
long as it evaluates to something suitable for the lefthand side of
an assignment. This expression is evaluated each time through the
loop, which means that it may evaluate differently each time. For
example, you could use code like the following to copy the names of
all object properties into an array:
var o = {x:1, y:2, z:3};
var a = new Array( );
var i = 0;
for(a[i++] in o) /* empty loop body */;
JavaScript arrays are simply a specialized kind of object. Therefore,
the for/in loop enumerates array indexes as well
as object properties. For example, following the previous code block
with this line enumerates the array "properties" 0, 1,
and 2:
for(i in a) alert(i);
The for/in loop does not specify the order in
which the properties of an object are assigned to the variable. There
is no way to tell what the order will be in advance, and the behavior
may differ between implementations or versions of JavaScript. If the
body of a for/in loop deletes a property that has
not yet been enumerated, that property will not be enumerated. If the
body of the loop defines new properties, whether or not those
properties will be enumerated by the loop is
implementation-dependent.
The for/in loop does
not actually loop through all
possible properties of all objects. In the same way that some object
properties are flagged to be read-only or permanent (nondeletable),
certain properties are flagged to be nonenumerable. These properties
are not enumerated by the for/in loop. While all
user-defined properties are enumerated, many built-in properties,
including all built-in methods, are not enumerated. As we'll
see in Chapter 8, objects can inherit properties
from other objects. Inherited properties that are user-defined are
also enumerated by the for/in loop.