The for keyword is used in two ways in JavaScript. You'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 left 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 left 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 can 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 among 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 you'll see in Chapter 7, objects can inherit properties from other objects. Inherited properties that are user-defined are also enumerated by the for/in loop.
for关键字在javascript中有两种用法,在for循环里,你已经看到了他是如何使用的,for也可以使用在for/in语句里,下面的语句稍微不同于循环,
for (variable in object) statement
variable可以是以下中的任何一个,命名变量、var关键字声明的变量、数组的一个元素或者对象的一个属性(即其必须是一个适当的、可赋值的左值),object是命名对象或者是可返回对象的表达式,通常,statement是声明语句或构成循环体的语句块。
你可以使用while或者for循环简单的通过递增索引的方式迭代任意数组元素。而for/in循环提供了一个迭代对象属性的方法,object的每个属性for/in循环体都执行一次迭代,在循环体执行前,对象的属性名字作为string类型付给了变量variable。在循环体内,可以使用这个变量通过[]操作符访问对象的属性值,例如,下面的for/in循环打印了一个对象每一个属性的名字和属性值
for (var prop in my_object) { document.write("name: " + prop + "; value: " + my_object[prop], "<br>"); }
注意:在for/in中的variable变量可以是任意表达式,只要执行结果是可赋值的左值即可.这个表达式循环时每次都会执行,意思是说:每次执行的都不同。例如,编写如下代码拷贝对象的所有属性到数组里:
var o = {x:1, y:2, z:3}; var a = new Array( ); var i = 0; for(a[i++] in o) /* empty loop body */;
其实,javascript数组也只不过是一个特殊的对象而已,因此,for/in循环迭代数组索引和循环迭代对象属性是一样的,例如,上面代码块再加上这句迭代输出数组属性值为0,1,2
for(i in a) alert(i);
for/in循环不能指定赋值给variable变量的对象属性的顺序,无法指定哪一个将在前面,在不同的javascript版本中,这个行为也是不同的。如果for/in循环体内删除了一个尚未迭代的属性那么这个属性不会被迭代,如果在循环体内添加了属性,那么这些属性是否被迭代要视具体实现了
for/in循环实际上不是万能的,它并不能迭代所有对象的所有属性,有些特殊情况下,例如一些对象的属性标示为只读或者不可变的,标示为不可迭代的。这些属性不能被for/in迭代。所有用户自定义属性是可以迭代的,许多内建属性包括所有内建方法是不可以被迭代的。在第七章,你将看到对象是可以继承其他对象的属性的,继承而来的属性是用户自定义属性,是可以用for/in迭代的