for in循环
作用:循环对象或者数组
语法:
for (变量名 in 数组名/对象名){
}
举例:
var obj = {
name : 'abc',
age : 18,
sex : '男'
};
var arr = ['abc', 18, '男'];
for(prop in obj){
console.log(prop); //name age sex
console.log(typeof(prop)); //string
}
for(prop in arr){
console.log(prop); //0 1 2
console.log(typeof(prop)); //string
}
从结果我们可以看到如果for in循环的是对象,那么它的变量名就是对象的属性名,如果循环的是数组,那么它的变量名就是数组的索引。而且它的变量名是字符串类型的。
但是如果我们这么来写
var obj = {
name : 'abc',
age : 18,
sex : '男'
}
Object.prototype.address = '重庆';
for(prop in obj){
console.log(prop); //name age sex address
}
诶,明明我们在obj里面没有写address,怎么给我输出了一个address呢。那是因为for in循环会把某个类型原型中的方法与属性遍历出来,这样的话可能会引起不必要的麻烦。
于是我们可以这样写
var obj = {
name : 'abc',
age : 18,
sex : '男'
}
Object.prototype.address = '重庆';
for(prop in obj){
if(obj.hasOwnProperty(prop)){
console.log(prop); //name age sex
}
}
可能会遇到的情况
var obj1 = {
name : 'abc',
age : 18,
sex : '男'
};
var obj2 = {};
for(prop in obj1){
obj2[prop] = obj1[prop];
}
console.log(obj2);
//输出{name: "abc", age: 18, sex: "男"}
obj2[age] = 18; //报错
obj2[age]; //报错
obj2.age = 18; //{age: 18}
obj2[name] = 'abc'; //{'': 'abc'}
obj2[name]; //'abc'
obj2.name; //'abc'
为什么在for in循环中不报错而在外面写却会报错。
这是因为访问对象的属性有两种方法
- obj.属性名
- obj[‘属性名’]
在for in循环中,由于prop是字符串类型,所以相当于用的是第二种访问方式
而在上面的代码中,obj2[age]这种方式,age代表一个变量,这个变量明显没有定义,所以会报错。但是如果obj2.age = 18,这种方式却可以定义一个属性。
我们可以看到在上面还有一种情况,那就是obj2[name] = ‘abc’居然不报错,而且结果是{” “: ‘abc’}。
这是因为name这个变量有点特殊,每个窗口都有一个name属性,默认是空的。
版权声明:本文为qq_41938120原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。