js对象属性的枚举

属性的可枚举性和所有权

JavaScript 对象中的每个属性能根据三个因素进行分类:

  • 可枚举或不可枚举
  • 字符串或 symbol
  • 自有属性或从原型链继承的属性

属性的所有权取决于属性是否直接属于该对象,而不是对象的原型链。

所有的属性,不论是可枚举或不可枚举、是字符串或 symbol、是自有的或继承的,都能用点记号表示法或方括号表示法进行访问。

遍历对象属性

在 JavaScript 中有许多获取对象属性的方法:

  • Object.keys
  • Object.getOwnPropertyNames
  • Object.getOwnPropertySymbols
  • Object.getOwnPropertyDescriptors
  • Reflect.ownKeys
  • for...in

Object.keys()

Object.keys() 静态方法返回一个由给定对象自身的可枚举的字符串键属性名组成的数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const base = {
name: "John",
[Symbol.for("gender")]: "male",
};
// 定义一个不可枚举的 Symbol 属性
Object.defineProperty(base, Symbol.for("weight"), {
value: "70kg",
enumerable: false,
});
// 定义一个不可枚举的普通属性
Object.defineProperty(base, "interest", {
value: "reading",
enumerable: false,
});
const obj1 = {
age: 18, // 可枚举的字符串属性
[Symbol.for("hobby")]: "coding", // 可枚举的 Symbol 属性
};
// 定义一个不可枚举的普通属性
Object.defineProperty(obj1, "hobby", {
value: "coding",
enumerable: false,
});
// 定义一个不可枚举的 Symbol 属性
Object.defineProperty(obj1, Symbol.for("height"), {
value: "180cm",
enumerable: false,
});
// 设置 obj1 的原型为 base 对象
Object.setPrototypeOf(obj1, base);

const keys = Object.keys(obj1);

console.log(keys); // ["age"],只包含 obj1 自身的可枚举的字符串键属性

Object.keys()

Object.getOwnPropertyNames()

Object.getOwnPropertyNames() 静态方法返回一个数组,其包含给定对象中所有自有属性(包括不可枚举属性,但不包括使用 symbol 值作为名称的属性)

Object.getOwnPropertyNames()

Object.getOwnPropertySymbols()

Object.getOwnPropertySymbols() 静态方法返回一个包含给定对象所有自有 Symbol 属性的数组。

Object.getOwnPropertySymbols()

Object.getOwnPropertyDescriptors()

Object.getOwnPropertyDescriptors() 静态方法返回给定对象的所有自有属性描述符

Object.getOwnPropertyDescriptors()

Reflect.ownKeys()

Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。它的返回值等同于 Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))

Reflect.ownKeys()

for…in

for...in 语句迭代一个对象的所有可枚举字符串属性(除 Symbol 以外),包括继承的可枚举字符串属性

for...in

参考


js对象属性的枚举
https://www.my-web.cn/js/object-keys/
发布于
2026年5月28日
许可协议