js中的for in循环

  • Post author:
  • Post category:其他




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循环中不报错而在外面写却会报错。

这是因为访问对象的属性有两种方法

  1. obj.属性名
  2. obj[‘属性名’]

在for in循环中,由于prop是字符串类型,所以相当于用的是第二种访问方式

而在上面的代码中,obj2[age]这种方式,age代表一个变量,这个变量明显没有定义,所以会报错。但是如果obj2.age = 18,这种方式却可以定义一个属性。

我们可以看到在上面还有一种情况,那就是obj2[name] = ‘abc’居然不报错,而且结果是{” “: ‘abc’}。

这是因为name这个变量有点特殊,每个窗口都有一个name属性,默认是空的。



版权声明:本文为qq_41938120原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。