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