[Chapter 5] 5.6 for...in
Author: David Flanagan
Date: Fri Aug 29 10:52:34 1997

#

| Chapter 5 Statements |

## 5.6 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

The `variable` should be the name of a variable, or should be an element of an array or a property of an object; it should be something suitable as the left-hand side of an assignment expression. `object` is the name of an object, or an expression that evaluates to an object. As usual, the `statement` is a primitive 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 out the name and value of each property of an object:

    for (prop in my_object) {
        document.write("name: " + prop + "; value: " + my_object[prop], "<br>");
    }

The `for/in` loop does not specify in what order the properties of an object will be assigned to the variable. There is no way to tell in advance, and the behavior may differ between implementations or versions of JavaScript.

The `for/in` loop does not actually loop through all possible properties of all objects. The rules below specify exactly which properties the statement does list and which it does not in Navigator 3.0. Internet Explorer may use somewhat different rules:

- It lists any user-defined properties or methods explicitly set in a user-defined or system object.

- In general, it lists the properties, but not the methods, of built-in and HTML objects. Certain properties, such as the `constructor` property are never listed, and some built-in objects may have object-specific listing behavior. This object-specific behavior may differ between Navigator and Internet Explorer.

- It lists all defined indexes of user-defined arrays, but does not list the `length` property of those arrays.

- It lists the `length` property and indices of built-in and HTML arrays.

- It does not list properties of functions, methods, or constructors.

- It does not list the constants defined by the `Math` and `Number` objects, such as `Math.PI`. (Since `Math` and `Number` are constructor functions, this follows from the above point.)

- It does not list object properties or methods implicitly defined in an object with the `var` or `function` keywords. (In client-side JavaScript, defining a variable with `var` is the same as defining a property of the same name in the current Window object, except for the different treatment of these two cases by the `for/in` loop.) Properties implicitly defined by the `var` keyword at any time will never again be listed, even if the property is afterwards directly and explicitly set in the object. This last is not true for the `function` keyword.

for |  | break