JavaScript 支持不同类型的循环:
for - 循环代码块一定的次数
for/in - 循环遍历对象的属性
while - 当指定的条件为 true 时循环指定的代码块
do/while - 同样当指定的条件为 true 时循环指定的代码块
1. in运算符:要求其左边的运算数是一个字符串,或可以被转换为字符串,右边的运算数是一个对象或数组。如果该运算符左边的值是右边对象的一个属性名,则返回true。
例如:
1
2
3
4
|
var
point={x:1,y:2};
//对象直接量
var
has_x=
"x"
in
point;
//返回true
var
has_z=
"z"
in
point;
//返回false
var
ts=
"toString"
in
point;
//返回true,toString为继承方法
|
2. for/in语句:语法,
for (variable in object)
statement;
提供了一种遍历对象属性的方法。
例:
1
2
3
|
for
(
var
prop
in
my_object) {
document.write(
"name:"
+prop+
";value:"
+my_object[prop],
"<br>"
);
}
|
javascript的数组是一种特殊的对象,因此for/in循环可以像枚举对象属性一样枚举数组下标。
可以把一个对象的所有属性名复制到一个数组中,
例:
1
2
3
4
5
|
var
o= {x:1,y:2,z:3};
var
a=
new
Array();
var
i=0;
for
(a[i++]
in
o)
;
//空语句,用于初始化数组
|
3. in运算符与for/in语句不同,for/in语句in的左边可以是声明一个变量的var语句,数组的一个元素或者是对象的一个属性,不能使字符串。
4. 数组常用的存取属性运算符是“[]”,而不是“.”。使用“[]”来命名属性名师字符串值,是动态的,可以在运行时改变,而不是一个标识符“.”。
例:
1
2
3
4
5
6
7
8
|
var
stock_name= get_stock_name_from_user();
//从用户处获取股票名
var
share= get_number_of_shares();
//得到股票数量
portfolio[stock_name]= share;
//动态地创建数组股票,并为每支股票赋值
将该例子与
for
/
in
循环一起使用,当用户输入了他的投资组合,可以计算当前总值
var
value= 0;
for
(stock
in
portfolio) {
value +=get_share_value(stock)*portfolio[stock];
}
|
stock存取的是每支股票的名字。
portfolio[stock]存取的是每支股票的数量。
for-in循环
功能:遍历对象属性,把属性名和属性值都提出来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
var
obj = {
"key1"
:
"value1"
,
"key2"
:
"value2"
,
"key3"
:
"value3"
};
function
EnumaKey(){
for
(
var
key
in
obj ){
alert(key);
}
}
function
EnumaVal(){
for
(
var
key
in
obj ){
alert(obj[key]);
}
}
EnumaKey(obj)
//key1 key2 key3
EnumaVal(obj)
//value1 value2 value3
|
数组也可以这样遍历,但不推荐,因为不能保证顺序,而且如果在Array的原型上添加了属性,这个属性也会被遍历出来。
for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”。
从技术上将,你可以使用for-in循环数组(因为JavaScript中数组也是对象),但这是不推荐的。因为如果数组对象已被自定义的功能增强,就可能发生逻辑错误。另外,在for-in中,属性列表的顺序(序列)是不能保证的。所以最好数组使用正常的for循环,对象使用for-in循环。