Object.keys()和for in 区别

612 阅读1分钟

Object.keys()遍历出来的是可枚举的属性和for in一样,但是for in还可以循环构造函数都prototype中都属性。

1.for..in..


for (var props in p1) {
  console.log('for-in:: '+props)
}

// 结果
// for-in:: work
// for-in:: eatting
// for-in:: name  该属性继承于Person.prototype
// for-in:: sayName  该属性继承于Person.prototype
// 从结果可以看出,for...in不但循环自己属性,还会循环构造函数都prototype中都属性。

// 如果实例属性是不可枚举的话,那for...in能循环出来吗?
// 我们把p1的work属性设为不可枚举
Object.defineProperty(p1, 'work', {
  enumerable: false // 默认为true,表示可枚举
})

// 继续循环
for (var props in p1) {
  console.log('for-in:: '+props)
}
// 结果
// for-in:: eatting
// for-in:: name  该属性继承于Person.prototype
// for-in:: sayName  该属性继承于Person.prototype
// 看吧,work没被循环出来,因为是不可枚举的。


// 如果想要循环p1实例自己的属性,则使用hasOwnProperty即可。
for (var props in p1) {
  if (p1.hasOwnProperty(props)) {
    console.log('for-in:: '+props)
  }
}
// 结果
// for-in:: work
// for-in:: eatting
// 从结果可以看出,如果实例p1只想要循环自己的属性,则使用hasOwnProperty即可。

2.Obiect.keys()

console.log(Object.keys(p1))
// 结果:["work", "eatting"]
// 得到是一个可枚举属性数据,只循环实例p1自身属性,不循构造函数的prototype。
// 可见Object.keys()相当于for...in使用hasOwnProperty。

// 同样的,如果work是不可枚举的,那Object.keys()能循环出来吗?
// 我们把p1的work属性设为不可枚举
Object.defineProperty(p1, 'work', {
  enumerable: false // 默认为true,表示可枚举
})
console.log(Object.keys(p1))
// 结果:["eatting"]
// 看吧,work没被循环出来,因为是不可枚举的。