zoukankan      html  css  js  c++  java
  • for in,Object.keys和Object.getOwnPropertyNames的区别

    var parent = Object.create(Object.prototype, {
        a: {
            value: 1,
            writable: true,
            enumerable: true,
            configurable: true            
        }
    });

    parent继承自Object.prototype,有一个可枚举的属性a。下面我们在创建一个继承自parent的对象child。

    var child = Object.create(parent, {
        b: {
            value: 2,
            writable: true,
            enumerable: true,
            configurable: true
        },
        c: {
            value: 3,
            writable: true,
            enumerable: false,
            configurable: true
        }
    });

    child有两个属性b和c,其中b为可枚举属性,c为不可枚举属性。

    下面我们将用四种方法遍历child对象,来比较四种方法的不同。如下的代码代表程序的输出。

    for in

    for in是es3中就存在,最早用来遍历对象(集合)的方法。

    for (var key in child) {
        console.log(key);
    }
    // > b
    // > a
    

    从输出可以看出,for in会输出自身以及原型链上可枚举的属性。

    注意:不同的浏览器对for in属性输出的顺序可能不同。

    如果仅想输出自身的属性可以借助 hasOwnProperty。可以过滤掉原型链上的属性。

    for (var key in child) {
        if (child.hasOwnProperty(key)) {
            console.log(key);
        }
    }
    // > b
    

    上面的代码,仅输出了child自己的可枚举属性b,而没有输出原型parent中的属性。

    Object.keys

    Object.keyses5中新增的方法,用来获取对象自身可枚举的属性键。

    console.log(Object.keys(child));
    // > ["b"]
    

    可以看出Object.keys的效果和for in+hasOwnProperty的效果是一样的。

    Object.getOwnPropertyNames

    Object.getOwnPropertyNames也是es5中新增的方法,用来获取对象自身的全部属性名。

    console.log(Object.getOwnPropertyNames(child));
    // > ["b", "c"]

    总结

    而遍历对象有5种方法:
    (1)for...in
      for...in循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)。
    (2)Object.keys(obj)
      Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。
    (3)Object.getOwnPropertyNames(obj)
      Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。
    (4)Object.getOwnPropertySymbols(obj)
      Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有Symbol属性。
    (5)Reflect.ownKeys(obj)
      Reflect.ownKeys返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举。
     
  • 相关阅读:
    Android 自定义android控件EditText边框背景
    Android安全问题 静音拍照与被拍
    Android 自绘TextView解决提前换行问题,支持图文混排
    Android EditText属性
    Android invalidate()自动清屏,屏幕刷新
    Cocos2d-x 3.0final 终结者系列教程12-Vector&map&value
    思维方式--SMART原则
    从.net复制源代码中国农历阵列,必要做日历
    POJ 3071-Football(可能性dp)
    mongodb group包(最具体的、最受欢迎、最容易理解的解释)
  • 原文地址:https://www.cnblogs.com/amiezhang/p/8757242.html
Copyright © 2011-2022 走看看