for in

主要用于遍历对象的可枚举属性、包括自有属性、继承自原型的属性。

  1. var obj = {
  2. name: 'zhang',
  3. sex: 'male'
  4. }
  5. Object.defineProperty(obj,'age',{
  6. value: 18
  7. enumerable: false
  8. }) //增加不可枚举的属性age
  9. Object.prototype.fn1 = function(){
  10. console.log('我是函数fn1')
  11. } //通过原型链增加一个属性,为一个函数
  12. Object.prototype.b = 3 //通过原型链增加一个属性,为一个整型值3
  13. for(let key in obj){
  14. console.log(key)
  15. }
  16. //name sex fn1 b

obj = {name: “zhang”, sex: “male”, age: 18}
通过例子可以看出,通过for in循环出来的key依次为 name、sex、fn1、b
示例中的属性age为不可枚举的,所以没有循环出来,如果设置enumerable:true则可以循环出来。

Object.keys()

返回一个数组,元素均为对象自有可枚举的属性。

  1. var obj = {
  2. name: 'zhang',
  3. sex: 'male'
  4. }
  5. Object.defineProperty(obj,'age',{
  6. value: 18
  7. enumerable: false
  8. }) //增加不可枚举的属性age
  9. Object.prototype.fn1 = function(){
  10. console.log('我是函数fn1')
  11. } //通过原型链增加一个属性,为一个函数
  12. Object.prototype.b = 3 //通过原型链增加一个属性,为一个整型值3
  13. Object.keys(obj)
  14. // ['name','sex']

obj = {name: “zhang”, sex: “male”, age: 18}
返回值为 [‘name’,’sex’] ,可以明显的看出来obj的自有属性有是三个,分别是name、sex、age, 但是age是不可枚举的属性,所有对象obj经过Object.keys()处理过,返回自有可枚举的属性即为[‘name’,’sex’]

Object.getOwnPropertyNames()

返回一个数组,元素均为对象的自有属性,包括可枚举和不可枚举类型。

  1. var obj = {
  2. name: 'zhang',
  3. sex: 'male'
  4. }
  5. Object.defineProperty(obj,'age',{
  6. value: 18
  7. enumerable: false
  8. }) //增加不可枚举的属性age
  9. Object.prototype.fn1 = function(){
  10. console.log('我是函数fn1')
  11. } //通过原型链增加一个属性,为一个函数
  12. Object.prototype.b = 3 //通过原型链增加一个属性,为一个整型值3
  13. Object.getOwnPropertyNames(obj)
  14. //['name','sex','age']

obj = {name: “zhang”, sex: “male”, age: 18}
可以明显的看出来obj的自有属性有是三个,分别是name、sex、age, 故返回对象的自有属性即为[‘name’,’sex’,’age’]