JavaScript对象是动态键值集合,点号访问限于合法标识符,方括号支持任意字符串及表达式;隐式类型转换易致陷阱,方法调用需注意this绑定,属性可枚举性与可配置性影响遍历和删除。
JavaScript 对象不是“容器”,而是带属性和方法的动态键值集合;访问方式取决于属性名是否合法、是否被代理或冻结,也取决于你用的是点号还是方括号。
. 和方括号访问 [] 的区别
点号只能访问符合标识符规则的属性名(即以字母/下划线/$开头,后续可含数字);方括号则支持任意字符串、变量甚至表达式。
obj.name 合法,obj.123、obj.my-name、obj.user info 都会报语法错误obj["123"]、obj["my-name"]、obj["user info"] 全部合法const key = "age"; obj[key]
方括号中若传入非字符串值,JS 会自动调用 toString() 转成字符串——这常导致意外行为。

obj[1] 等价于 obj["1"],不是数组索引式访问obj[null] → obj["null"],obj[undefined] → obj["undefined"]
obj[[1,2]] → obj["1,2"](因为数组的 toString() 返回逗号拼接)obj[String(key)]
this 绑定取决于调用位置对象上的方法只是普通函数,赋值给变量后调用,this 就会丢失指向。
obj.sayHi() 中 this 指向 obj
const fn = obj.sayHi; fn() 中 this 在非严格模式下是 window(浏览器),严格模式下是 undefined
fn.bind(obj)、obj.sayHi.bind(obj)、箭头函数封装、或直接用 obj.sayHi.call(obj)
this 很可能不是你预期的对象用 Object.defineProperty 或 class 定义的属性默认不可枚举;for...in 和 Object.keys() 都受此约束。
for...in 遍历所有**可枚举 + 自身或原型链上**的字符串键属性Object.keys(obj) 只返回**自身 + 可枚举**的属性名数组Object.getOwnPropertyNames(obj) 返回**自身所有**(包括不可枚举)属性名delete obj.prop 是否成功,取决于该属性是否可配置(configurable: true)const obj = {};
Object.defineProperty(obj, 'hidden', {
value: 42,
enumerable: false,
configurable: true
});
console.log(Object.keys(obj)); // []
console.log(Object.getOwnPropertyNames(obj)); // ["hidden"]
delete obj.hidden; // true(因为 configurable: true)
真正难的不是记语法,而是理解属性描述符(descriptor)如何控制访问行为,以及在 Proxy、Object.freeze、解构赋值等场景下这些控制如何被绕过或强化。