JavaScript对象字面量声明需区分合法键名类型及隐式转换规则,点号访问限于标识符命名属性,方括号访问更灵活但需注意null/undefined转字符串问题,属性存在性判断应使用in、hasOwnProperty或Object.hasOwn,安全访问推荐可选链与空值合并操作符。

JavaScript中对象字面量声明和属性访问看似简单,但细节决定代码的可读性、健壮性和兼容性。关键在于理解语法允许范围、运行时行为差异,以及不同访问方式的适用场景。
字面量声明:合法键名与隐式转换规则
对象字面量中,键(key)可以是字符串、数字、标识符(即不带引号的合法变量名),或ES2015+支持的计算属性名(用方括号包裹表达式)。
- 不带引号的键名必须符合标识符命名规则(如 user、_id、$name),不能含空格、连字符、点号或以数字开头;否则会报语法错误
- 含空格、短横线(-)、点(.)、斜杠(/)等特殊字符的键,必须用引号包裹,如 "first-name"、"user.email"
- 数字键会被自动转为字符串,{ 42: "answer" } 等价于 { "42": "answer" };访问时也按字符串处理(obj[42] 和 obj["42"] 效果相同)
- 计算属性名需用方括号,如 { [prefix + "Name"]: value },适用于动态生成键名的场景
点号访问(.):简洁但受限
点号只能用于访问符合标识符规则的属性名,且该属性名在编写时已知、静态确定。
- ✅ 正确:obj.name、obj.$id、obj._count
- ❌ 错误:obj.first-name(解析为减法)、obj.user.email(试图访问不存在的 user 属性)、obj.2ndTry(以数字开头)
- ⚠️ 注意:点号访问不会触发任何转换,若属性不存在,结果为 undefined,不会报错
方括号访问([]):灵活但需注意类型
方括号接受任意表达式,其运行结果会被强制转为字符串作为属性键,因此更通用,也更适合动态访问。
立即学习“Java免费学习笔记(深入)”;
- ✅ 支持变量:obj[key]、obj["first-name"]、obj[2](等价于 obj["2"])
- ✅ 支持表达式:obj["user" + i]、obj[Object.keys(obj)[0]]
- ⚠️ 注意:null 或 undefined 作为键时,会被转成字符串 "null" 或 "undefined",不是报错,而是创建/访问名为 "null" 的属性 —— 这常是隐蔽bug来源
- ? 建议:对可能为 null/undefined 的变量做校验,或使用可选链操作符(obj?.[key])避免意外赋值
属性存在性判断与安全访问
仅靠 obj.prop === undefined 不足以判断属性是否存在(因属性值可能被显式设为 undefined)。应结合语义选择合适方法:
- in 操作符:检查属性是否存在于对象自身或原型链上,如 "toString" in obj → true(通常来自 Object.prototype)
- obj.hasOwnProperty("prop"):仅检查对象自身(不含原型),返回布尔值
- Object.hasOwn(obj, "prop")(ES2022+):现代推荐替代 hasOwnProperty,避免被覆盖风险
- 可选链(?. )与空值合并(??):组合使用可安全取值并提供默认,如 obj?.user?.name ?? "Anonymous"










