Maison > Article > interface Web > Il existe plusieurs façons de parcourir des objets dans JS
Il y a quelques jours, un ami m'a demandé Object.getOwnPropertyNames()
à quoi elle sert
Je n'utilise pas vraiment cette méthode en temps ordinaire, donc je ne sais pas comment y répondre pendant un moment
D'après le nom de la méthode, cela devrait être. Ce qui est renvoyé est un tableau composé des propres noms d'attributs de l'objet
N'est-ce pas la même chose que la méthode Object.keys()
? 🎜>Je sentais que les choses n'étaient pas si simples, alors j'ai regardé de plus près ces méthodes. La différence entre les méthodes de parcours d'objets
for in
// 创建一个对象并指定其原型,bar 为原型上的属性 const obj = Object.create({ bar: 'bar' }) // foo 为对象自身的属性 obj.foo = 'foo' for (let key in obj) { console.log(obj[key]) // foo, bar }
Oui Voyez que les attributs sur le prototype de l'objet sont également recyclés
Dans ce cas, vous pouvez utiliser le méthode pour filtrer les attributs sur la chaîne du prototype
for (let key in obj) { if (obj.hasOwnProperty(key)) { console.log(obj[key]) // foo } }
A ce moment, le prototype L'attribut bar est filtré hasOwnProperty()
Object.keys(obj).forEach((key) => { console.log(obj[key]) // foo })Il existe également des méthodes
Object.keys()
et des méthodes forEach()
. La portée de ces deux méthodes est similaire à la méthode . Par conséquent, il n'est plus expliqué que la boucle Object.values()
for in. La méthode Object.entries()
ne renverra pas les propriétés non énumérables de l'objet Object.keys()
Object.keys()
Object.getOwnPropertyNames()
// 创建一个对象并指定其原型,bar 为原型上的属性 // baz 为对象自身的属性并且不可枚举 const obj = Object.create({ bar: 'bar' }, { baz: { value: 'baz', enumerable: false } }) obj.foo = 'foo' // 不包括不可枚举的 baz 属性 Object.keys(obj).forEach((key) => { console.log(obj[key]) // foo }) // 包括不可枚举的 baz 属性 Object.getOwnPropertyNames(obj).forEach((key) => { console.log(obj[key]) // baz, foo })via la méthode
Object.getOwnPropertyNames()
Le Object.getOwnPropertySymbolsforEach
renvoie un tableau de propriétés Symbol de l'objet lui-même, à l'exclusion des propriétés de chaîne Object.getOwnPropertySymbols()
Object.getOwnPropertySymbols(obj).forEach((key) => { console.log(obj[key]) })Rien, car l'objet n'a pas encore de propriété Symbol
// 给对象添加一个不可枚举的 Symbol 属性 Object.defineProperties(obj, { [Symbol('baz')]: { value: 'Symbol baz', enumerable: false } }) // 给对象添加一个可枚举的 Symbol 属性 obj[Symbol('foo')] = 'Symbol foo' Object.getOwnPropertySymbols(obj).forEach((key) => { console.log(obj[key]) // Symbol baz, Symbol foo })
Object.getOwnPropertySymbols()
.
Reflect.ownKeys(obj).forEach((key) => { console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo })Comparaison
ConclusionReflect.ownKeys()
方式 | 基本属性 | 原型链 | 不可枚举 | Symbol |
---|---|---|---|---|
for in | 是 | 是 | 否 | 否 |
Object.keys() | 是 | 否 | 否 | 否 |
Object.getOwnPropertyNames() | 是 | 否 | 是 | 否 |
Object.getOwnPropertySymbols() | 否 | 否 | 是 | 是 |
Reflect.ownKeys() | 是 | 否 | 是 | 是 |
"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!