美文网首页前端相关
对于遍历对象的几种方法的总结

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

作者: DeeJay_Y | 来源:发表于2017-10-13 13:29 被阅读101次

    对于对象的遍历,

         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"]
    

    相关文章

      网友评论

        本文标题:对于遍历对象的几种方法的总结

        本文链接:https://www.haomeiwen.com/subject/cmrzyxtx.html