JavaScript-对象的枚举

我们先来看一个比较实际的问题,假如我们使用到了一个对象,但是不知道这个对象有多少个属性和方法,我们要遍历这个对象的所有方法和属性,怎么办?


我们先来铺垫一个简单的问题:

我们都知道对象.属性||方法就是访问它,但是在计算机底层中还需要一步转化。

        var obj= {
            name:'cyl',
            age:19,
            school:'wust',
            sex:'male',
            food:function () {
                console.log("I like eating fish");
            }
        }

我们用这俩种遍历方法都是可以的,而且计算机底层使用的是第二种咯,这里需要注意我'name变成了字符串'name',因为[]里面需要放的是属性名是string类型的。

下面介绍一下for in循环

这个循环是专门来遍历对象的

看一下如下代码

        var obj= {
            name:'cyl',
            age:19,
            school:'wust',
            sex:'male',
            food:function () {
                console.log("I like eating fish");
            }
        }
        for (var key in obj) {
            console.log(key+"       "+typeof(key));
        }

for in循环就是这个结构了,第一个参数随便写吧,第二写对象,然后循环就把每一个属性和方法的方法名都找出来。

我还打出来他们的类型是字符串string类型

然后就利用刚刚上面那个知识点来访问对象的属性和方法

扫描二维码关注公众号,回复: 155900 查看本文章

for ( var key in obj) {
console . log( obj[ key]) ;
}

我们注意到这里key没有加''那是因为它本身就是string类型的。



这里还有一点问题,我们看如下代码:

        var obj= {
            name:'cyl',
            age:19,
            school:'wust',
            sex:'male',
            food:function () {
                console.log("I like eating fish");
            },
            __porto__: {
                drink:'牛奶'
            }
        }
        for (var key in obj) {
            console.log(obj[key]);
        }

我们发现居然打印了drink属性。


我们改一下代码:我们加上Object.prototype.abc=123;

果然不老实,沿着原始链找它的原型,把原型也输出了,但是对于系统自带的一下属性toString什么的一些,并不会管。

事实也是如此。

如何解决了?

这里就需要利用hasOwnProperty()函数了

该函数可以判断属性和方法是否直接属于这个对象,不是原型继承下来的。

        var obj= {
            name:'cyl',
            age:19,
            school:'wust',
            sex:'male',
            food:function () {
                console.log("I like eating fish");
            },
            __proto__: {
                drink:'牛奶'
            }
        }
        Object.prototype.abc=123;
        for (var key in obj) {
            if (obj.hasOwnProperty(key)) 
              console.log(obj[key]);
        }

这样就完美了。




猜你喜欢

转载自blog.csdn.net/wust_cyl/article/details/79867309