JavaScript对象属性访问分已知键名(用点号或方括号)和未知键名(需遍历);点号适用于合法标识符,方括号支持动态键、特殊字符及变量;可选链操作符?.可安全访问嵌套属性;遍历推荐Object.keys()、values()、entries()及for...of配合entries(),兼顾安全性与语义清晰性。

JavaScript 中对象属性的访问和遍历有多种方式,核心在于区分“已知键名”和“未知键名”两种场景:前者用点号或方括号直接取值;后者需借助遍历方法获取所有键或键值对。
属性访问:点号 vs 方括号
点号(.)适用于键名是合法标识符且已知的情况,写法简洁;方括号([])更灵活,支持动态键名、含特殊字符或变量的键。
- obj.name 等价于 obj["name"],但 obj.first-name 会报错,必须写成 obj["first-name"]
- 键名来自变量时只能用方括号:const key = "age"; obj[key]
- 访问嵌套属性时,点号链式调用易出错(如 obj.user.profile.name 在中间某层为 undefined 时抛错),可用可选链操作符 obj?.user?.profile?.name 安全访问
遍历对象的键、值与键值对
对象本身不是可迭代对象,但 JavaScript 提供了多个静态方法将其转换为数组再遍历:
- Object.keys(obj) 返回字符串数组,包含所有可枚举自有属性的键
- Object.values(obj) 返回对应键的值组成的数组
- Object.entries(obj) 返回二维数组,每个子项是 [key, value] 形式,适合解构使用
例如:for (const [key, value] of Object.entries(user)) { console.log(key, value); }
立即学习“Java免费学习笔记(深入)”;
注意不可枚举与继承属性
默认情况下,Object.keys() 和 for...in 只返回**可枚举的自有属性**。若需包括不可枚举属性,可用 Object.getOwnPropertyNames();若要包含原型链上的可枚举属性,可用 for...in(但需配合 hasOwnProperty() 过滤)。
- for...in 会遍历原型链上可枚举属性,实际使用中常加判断:if (obj.hasOwnProperty(key)) { ... }
- Object.getOwnPropertyDescriptors(obj) 可查看所有自有属性的详细描述(包括是否可枚举、可配置等)
现代替代:for...of + Object.entries() 最推荐
相比传统 for...in,for...of 配合 Object.entries() 更安全、语义更清晰,避免原型污染问题,也天然支持解构和异步迭代(如配合 async/await 处理 Promise 数组)。
- 遍历并修改值:for (const [k, v] of Object.entries(obj)) { obj[k] = transform(v); }
- 转为 Map:new Map(Object.entries(obj)),便于后续高效查找或扩展操作


















