详尽分享遍历对象的几种方法

    一、for in

    for in循环是最基础的遍历对象的方式,它还会得到对象原型链上的属性

    const person=Object.create({

    // sex和height是原型链上的属性

    sex:'male',

    height:168

    });

    //name和age是属于对象的属性

    person.name='sunny';

    person.age=28;

    //sex和height出现在了原型链上而不是对象属性中

    console.log(person);

    //for in会将对象的属性和原型上的属性一块遍历出来,顺序是先对象属性然后是原型链上的属性

    for(let key in person){

    console.log(person【key】);//sunny 28 male 168

    }

    //如果需要过滤掉原型链上的属性,可以使用asOwnProperty()方法

    for(let key in person){

    if (person.hasOwnProperty(key)) {

    console.log(person【key】) //sunny 28

    }//代码效果参考:http://www.ezhiqi.com/bx/art_6523.html

    }

    二、Object.keys

    Object.keys()是ES5新增的一个对象方法,该方法返回对象自身属性名组成的数组,他会自动过滤掉原型链上的属性,然后可以通过数组的forEach()方法来遍历。

    const person=Object.create({

    // sex和height是原型链上的属性

    sex:'male',

    height:168

    });

    //name和age是属于对象的属性

    person.name='sunny';

    person.age=28;

    //这种方法不会遍历原型链上的属性

    Object.keys(person).forEach((key) => {

    console.log(person【key】) // sunny 28

    })

    三、Object.getOwnPropertyNames()

    也是ES5新增的一个对象方法,该方法返回对象自身属性名组成的数组,包括不可枚举的属性,也可以通过数组的forEach()方法来遍历。

    // 创建一个对象并指定其原型,bar 为原型上的属性

    // baz 为对象自身的属性并且不可枚举

    const obj = Object.create({

    bar: 'bar'

    }, {

    baz: {

    value: 'baz',

    enumerable: false

    }

    }//代码效果参考:http://www.ezhiqi.com/bx/art_2557.html)

    obj.foo = 'foo'

    // 不包括不可枚举的 baz 属性

    Object.keys(obj).forEach((key) => {

    console.log(obj【key】) // foo

    })

    // 包括不可枚举的 baz 属性

    Object.getOwnPropertyNames(obj).forEach((key) => {

    console.log(obj【key】) // baz, foo

    })

    除此之外还有:Object.getOwnPropertySymbols()、Reflect.ownKeys等,详细讲解见如有侵权请联系删除)