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 就会丢失指向。
立即学习“Java免费学习笔记(深入)”;
-
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、解构赋值等场景下这些控制如何被绕过或强化。











