这是我参与「第四届青训营 」笔记创作活动的第7天
了解一下For...in/ Object.keys() / Obejct.getOwnPropertyNames() 的各自用法,点出主要区别。
一、For...in
只遍历可枚举属性(包括自身的和继承的)
①for...in —— 对象
②for...in —— 数组
问题:由上面两组打印中可以看出,for...in会遍历自身及继承的(Array或Object的原型prototype上的属性)所有可遍历属性,但大多时候我们只想遍历自身的直接属性(即只想要遍历dog/obj2的可遍历属性)
解决: hasOwnProperty,判断某属性是否是自身的直接属性(非继承)
二、Object.keys(object)
返回一个所有元素都为字符串的数组,字符串是给定object的所有自身的可直接枚举(可for..in遍历)属性
注意:当object为构造函数,返回空数组(Object.keys(F))或属性名(let f = new F;Object.keys(f))
三、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']
解释:
- p是原型对象,对于c来说p的属性a就是继承的可遍历属性
- Object.create的第二个参数对象是添加到x中的直接属性,属性b是可枚举属性,属性c是不可枚举属性,[Symbol('d')]是类型为Symbol的可枚举属性
- For...in 遍历自身的可遍历属性(属性b)和继承的可遍历属性(属性a)
- Object.keys()获取自身的可遍历属性(属性b)
- Object.getOwnPropertyNames()获取自身所有的属性(属性b属性c),包括可遍历和不可遍历属性
- 三者都无法遍历以Symbol值作为名称的属性[Symbol('d')]
五、扩展:object.values 和 object.entries
Object.values():返回自身的所有可遍历的键值数组
Object.entries():返回自身的所有可遍历属性的键值对数组
六、总结
Object.keys() / Obejct.getOwnPropertyNames() / Object.values() / Object.entries() 都是用来获取属性的方法。for...in是遍历数组对象的方法之一。
未完待续:继续了解一下其他数组对象的遍历方法