遍历数组对象| 青训营笔记

92 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第7天

了解一下For...in/ Object.keys() / Obejct.getOwnPropertyNames() 的各自用法,点出主要区别。

一、For...in

只遍历可枚举属性(包括自身的和继承的

①for...in —— 对象

image.png

image.png

②for...in —— 数组

image.png

image.png

问题:由上面两组打印中可以看出,for...in会遍历自身及继承的(Array或Object的原型prototype上的属性)所有可遍历属性,但大多时候我们只想遍历自身的直接属性(即只想要遍历dog/obj2的可遍历属性)

解决: hasOwnProperty,判断某属性是否是自身的直接属性(非继承)

image.png

image.png

二、Object.keys(object)

返回一个所有元素都为字符串的数组,字符串是给定object的所有自身的可直接枚举(可for..in遍历)属性

注意:当object为构造函数,返回空数组(Object.keys(F))或属性名(let f = new F;Object.keys(f))

image.png

image.png

三、Object.getOwnPropertyNames(object)

返回一个给定object的所有自身的属性(包括不可枚举属性,但不包括以Symbol值作为名称的属性,比如属性[Symbol(‘a’)] : ’a’就不可被该方法遍历)

四、举个栗子

let p = { 
        a :'a'
    }
    let x = Object.create(p ,{
        b:{
            value:'b',//初始化赋值
            writable:true,//value值是否可改写
            enumerable:true, //可枚举。解释:是否可用for...in遍历,即是否可枚举
            configurable:true //是否能删除
        },
        c:{
            value:'b',
            writable:true,
            enumerable:false, //不可枚举
            configurable:true 
        },
        [Symbol('d')]:{
            value:'b',
            writable:true,
            enumerable:true, //可枚举
            configurable:true 
        }
    })
    for(let key in x){
        console.log(key) //b a
    }
    console.log(Object.keys(x))// ['b']
    console.log(Object.getOwnPropertyNames(x)) //['b','c']

解释:

  1. p是原型对象,对于c来说p的属性a就是继承的可遍历属性
  2. Object.create的第二个参数对象是添加到x中的直接属性,属性b是可枚举属性,属性c是不可枚举属性,[Symbol('d')]是类型为Symbol的可枚举属性
  3. For...in 遍历自身的可遍历属性(属性b)和继承的可遍历属性(属性a)
  4. Object.keys()获取自身的可遍历属性(属性b)
  5. Object.getOwnPropertyNames()获取自身所有的属性(属性b属性c),包括可遍历和不可遍历属性
  6. 三者都无法遍历以Symbol值作为名称的属性[Symbol('d')]

五、扩展:object.values 和 object.entries

Object.values():返回自身的所有可遍历的键值数组

Object.entries():返回自身的所有可遍历属性的键值对数组

六、总结

Object.keys() / Obejct.getOwnPropertyNames() / Object.values() / Object.entries() 都是用来获取属性的方法。for...in是遍历数组对象的方法之一。

未完待续:继续了解一下其他数组对象的遍历方法