HOWTO · JavaScript
获取 JavaScript 对象的键
本教程详细介绍了如何在 javascript 中获取对象的键。
本页内容
使用 Object.keys(obj) 可取得对象自身可枚举字符串属性名组成的数组。若需要让每个键与对应的值保持配对,请使用 Object.entries(obj)。这两种方法都不会修改对象。若使用循环并且也要遍历继承的可枚举属性,可用 for...in;如果任务要求只处理对象自身的属性,则在循环中进行筛选。
使用 Object.keys() 获取对象键
Object.keys() 会返回由对象自身可枚举字符串键组成的数组。当属性名事先未知时,这种方法很实用,例如处理 API 返回的记录。返回的数组只包含名称;可以用 obj[key] 读取对应的值。如果对象没有自身可枚举的字符串属性,结果就是空数组。符号属性不会包含在内。
属性顺序有明确规则,但不一定与键的写入顺序相同。数组索引键(从 0 到 4294967294 的规范整数索引字符串)会先按数值升序排列。其他字符串键则按属性创建顺序排列。像 "01" 这样的字符串不属于数组索引,因此会与其他字符串键一起排列。数组也遵循相同规则:Object.keys() 会以字符串形式返回数组中现有的可枚举索引键,而不会返回数组的值。
运行以下示例:
const record = { 4: 'pear', 2: 'mango', name: 'fruit', '01': 'label' };
const keys = Object.keys(record);
console.log(keys);
console.log(record[keys[0]]);
console.log(Object.keys(['red', 'blue']));
此示例展示了数值索引键排在其他字符串之前,"01" 保持在普通字符串键中,并使用返回的键查找对应的值。获取键不会改变 record 中属性的顺序或内容。
使用 Object.entries() 获取对象的键和值
如果下一步需要同时使用每个键及其对应的值,请使用 Object.entries(obj)。它会返回一个由二元数组组成的数组,形式类似 [[key, value], ...]。与 Object.keys() 一样,它只包含对象自身可枚举的字符串属性,遵循相同的属性顺序,并排除符号属性。它不会递归遍历值中恰好为对象的内容。
使用解构可以方便地处理每一组键值。下面这个完整示例会打印每个属性的标签和值:
const settings = { theme: 'dark', language: 'English' };
for (const [key, value] of Object.entries(settings)) {
console.log(`${key}: ${value}`);
}
如果只需要属性名,请选择 Object.keys();如果循环需要同时取得名称和值,请选择 Object.entries()。如果已经知道键,就无需枚举对象;可以直接通过 settings.theme 或 settings['theme'] 访问该值。
使用 for…in 遍历对象键
for...in 循环会遍历可枚举的字符串属性。它也可能包含通过对象原型继承的属性,因此结果可能与只列出自身属性的 Object.keys() 不同。如果要排除继承属性,请在循环中使用 Object.hasOwn(obj, key)。现代 JavaScript 支持此方法;在较旧的环境中,可以使用 Object.prototype.hasOwnProperty.call(obj, key)。
const parent = { category: 'fruit' };
const item = Object.create(parent);
item.name = 'mango';
for (const key in item) {
if (Object.hasOwn(item, key)) {
console.log(`${key}: ${item[key]}`);
}
}
循环可能会遇到 name 和继承而来的 category,而自身属性检查只会打印 name。如果要遍历所有可枚举属性,请省略检查。若要以可预测的方式列出对象自身的可枚举字符串键,通常 Object.keys() 是最清晰的选择。
枚举只遍历一层。如果顶层属性包含另一个对象,键列表中会包含顶层属性的名称,而它的值仍是那个嵌套对象。要列出嵌套对象的键,请对该值单独调用 Object.keys();递归遍历则需要额外编写逻辑来逐一访问嵌套对象。根据所需属性选择这三种方式:用 Object.keys() 获取名称,用 Object.entries() 获取名称和值的配对,用 for...in 遍历原型链上的可枚举属性。