您的位置:首页 > 移动开发 > Objective-C

for in,Object.keys和Object.getOwnPropertyNames的区别

2018-04-09 09:03 726 查看
varparent=Object.create(Object.prototype,{
a:{
value:1,
writable:true,
enumerable:true,
configurable:true
}
});


parent继承自Object.prototype,有一个可枚举的属性a。下面我们在创建一个继承自parent的对象child。

varchild=Object.create(parent,{
b:{
value:2,
writable:true,
enumerable:true,
configurable:true
},
c:{
value:3,
writable:true,
enumerable:false,
configurable:true
}
});


child有两个属性b和c,其中b为可枚举属性,c为不可枚举属性。

下面我们将用四种方法遍历child对象,来比较四种方法的不同。如下的代码代表程序的输出。

forin

forin是es3中就存在,最早用来遍历对象(集合)的方法。

for(varkeyinchild){
console.log(key);
}
//>b
//>a

从输出可以看出,forin会输出自身以及原型链上可枚举的属性。

注意:不同的浏览器对forin属性输出的顺序可能不同。

如果仅想输出自身的属性可以借助hasOwnProperty。可以过滤掉原型链上的属性。

for(varkeyinchild){
if(child.hasOwnProperty(key)){
console.log(key);
}
}
//>b

上面的代码,仅输出了child自己的可枚举属性b,而没有输出原型parent中的属性。

Object.keys

Object.keys是es5中新增的方法,用来获取对象自身可枚举的属性键。

console.log(Object.keys(child));
//>["b"]

可以看出Object.keys的效果和forin+hasOwnProperty的效果是一样的。

Object.getOwnPropertyNames

Object.getOwnPropertyNames也是es5中新增的方法,用来获取对象自身的全部属性名。

console.log(Object.getOwnPropertyNames(child));
//>["b","c"]

总结

而遍历对象有5种方法:


(1)for...in

  for...in循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)。

(2)Object.keys(obj)

  Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。

(3)Object.getOwnPropertyNames(obj)

  Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。

(4)Object.getOwnPropertySymbols(obj)

  Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有Symbol属性。

(5)Reflect.ownKeys(obj)

  Reflect.ownKeys返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: