HOME/Articles/

对于遍历对象的几种方法的总结

Article Outline

对于遍历对象的几种方法的总结

<!--more-->

对于对象的遍历,

     let obj = {a: 'b',c: 'd'}

一, for in (一般搭配hasOwnProperty来使用) 遍历原型链上可枚举的

    let obj = {
        a: 'b',
        c: 'd'
    }
    for (let key in obj) {
        console.log('key: ' + key + ',' + 'value: ' + obj[key])
    }
   // key: a,value: b
  // key: c,value: d

值得注意的是,for in 遍历对象,会将原型链上的所有可枚举的属性也遍历到。

    Object.prototype.test = 'myTest'
    let obj = {
        a: 'b',
        c: 'd'
    }
    for (let key in obj) {
        console.log('key: ' + key + ',' + 'value: ' + obj[key])
    }
    //key: a,value: b
    //key: c,value: d
    //key: test,value: myTest

对于不可枚举的属性(enumerable: false),比如说toString方法,那么for in 就不会遍历到

//    Object.prototype.test = 'myTest'
    Object.defineProperty(Object.prototype,'test',{
        enumerable: false, // 设为不可枚举之后  就无法遍历到,改为true即可遍历到
        value: 'myTest'
    })
    let obj = {
        a: 'b',
        c: 'd'
    }
    for (let key in obj) {
        console.log('key: ' + key + ',' + 'value: ' + obj[key])
    }

由于for in 遍历会遍历原型链上的属性,所以一般我们想要遍历对象本身的属性的时候,要加hasOwnProperty来进行一层过滤。

    Object.prototype.test = 'myTest'
    let obj = {
        a: 'b',
        c: 'd'
    }
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            console.log('key: ' + key + ',' + 'value: ' + obj[key])
        }
    }
    //key: a,value: b
    //key: c,value: d

二,Object.keys() 只遍历自身的可枚举属性

使用Object.keys()只能遍历到自身本身并且是可枚举的属性

    Object.prototype.test = 'myTest'
    let obj = {
        a: 'b',
        c: 'd'
    }
    let keys = Object.keys(obj)
    console.log(keys) //["a", "c"]
    Object.prototype.test = 'myTest'

    let obj = {
        a: 'b',
        c: 'd'
    }
    Object.defineProperty(obj,'non-em',{
        enumerable: true, //enumerable为false时不可遍历 为true时可以遍历到
        value: 'deejay'
    })
    let keys = Object.keys(obj)
    console.log(keys) // ["a", "c", "non-em"]

三, Object.getOwnPropertyNames 遍历所有自身属性 包含不可枚举的

    Object.prototype.test = 'myTest'
    let obj = {
        a: 'b',
        c: 'd'
    }
    Object.defineProperty(obj,'non-em',{
        enumerable: false, //enumerable为false时Object.getOwnPropertyNames也能遍历到
        value: 'deejay'
    })
    let keys = Object.getOwnPropertyNames(obj)
    console.log(keys)  //["a", "c", "non-em"]