一、for…in
首先我们定义一个对象,并给这个对象设置一些可枚举或不可枚举的属性,在原型上也加上一些属性。
let person = {
name:'pjh', [Symbol('age')]:20 } Object.defineProperties(person,{
country:{
enumerable:false, value:'korea' }, [Symbol('sex')]:{
enumerable:true, value:'man' } }) Object.defineProperties(person.__proto__,{
team:{
enumerable:true, value:'wannaone' }, school:{
enumerable:false, value:'zjut' }, [Symbol('time')]:{
enumerable:true, value:'1' }, [Symbol('year')]:{
enumerable:false, value:'1999' } })
for(var key in person){
console.log(key) //name team }
for…in可以遍历到自身及原型上的可枚举属性,不包含symbol属性,如果我们只想遍历自身的属性,就要加一个判断。
for(var key in person){
if(Object.prototype.hasOwnProperty.call(person,key)){
console.log(key) //name } }
二、Object.keys()
for(var key of Object.keys(person)){
console.log(key) //name }
Object.keys()只能遍历到对象自身的可枚举属性,不包括symbol属性。Vue 对 data 进行遍历响应式处理也是用这个方法。类似的还有Object.values()和Object.entires()
for(var value of Object.values(person)){
console.log(value) //pjh }
for(var [key,value] of Object.entries(person)){
console.log(key + ':' +value) //name:pjh }
es6中的Map也提供了与Object.values()和Object.entries() 等效的方法
let map = new Map(Object.entries(person)) for(var key of map.keys()){
console.log(key) //name:pjh } for(var value of map.values()){
console.log(key) //pjh } for(var [key,value] of map.entries()){
console.log(key +':' +value) //name:pjh }
三、Object.getOwnPropertyNames()
for(var key of Object.getOwnPropertyNames(person)){
console.log(key) //name country }
Object.getOwnPropertyNames()只能遍历到自身属性,不可枚举属性也能遍历到,不包括symbol属性。
for(var key of Object.getOwnPropertySymbols(person)){
console.log(key) //Symbol(age) Symbol(sex) }
Object.getOwnPropertySymbols()能遍历到自身的symbol属性
四、Reflect.ownKeys()
for(var key of Reflect.ownKeys(person)){
console.log(key) //name country Symbol(age) Symbol(sex) }
Reflect.ownKeys()能遍历到自身的所有属性,包括不可枚举属性和symbol属性
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178426.html原文链接:https://javaforall.net
