JavaScript对象是键值对的无序容器结构,键为字符串或Symbol,值可为任意类型;点号访问合法标识符属性,方括号支持动态键名;增删改属性分别用赋值、delete操作;读不到属性常因原型链、代理拦截或拼写错误。

JavaScript 对象到底是什么?
它不是某种特殊的数据类型,而是一种**容器结构**——用键(key)存值(value),键必须是字符串或 Symbol,值可以是任意类型(包括函数、其他对象、null、undefined)。你写的 { name: "Alice", age: 30 } 就是最常见的字面量对象,本质是键值对的无序集合。
用点号还是方括号访问属性?
两种方式都能读取属性,但适用场景不同:
- 点号
.只能访问**合法标识符命名**的属性,比如obj.name、obj.firstName - 方括号
[]支持动态访问:属性名可以是变量、含空格/特殊字符的字符串,甚至表达式,比如obj["first name"]、obj[myKey] - 点号在属性不存在时返回
undefined;方括号同理,但如果对象为null或undefined,会直接报错TypeError: Cannot read property 'xxx' of null
const user = { "full name": "Bob Smith", age: 28 };
console.log(user["full name"]); // ✅ 正确
console.log(user.full name); // ❌ 语法错误
console.log(user["age"]); // ✅ 正确
console.log(user.age); // ✅ 正确
修改和添加属性有没有区别?
没有本质区别。JavaScript 对象是动态的,无论属性原来存不存在,赋值操作都会“写入”该键:
-
obj.key = value和obj["key"] = value效果完全一致 - 如果 key 不存在,就新增;存在,就覆盖
- 注意:若对象被
Object.freeze()或设为const(仅变量引用不可变),赋值可能静默失败(非严格模式)或抛出TypeError - 删除属性要用
delete obj.key,不是赋undefined或null
const config = { theme: "dark" };
config.theme = "light"; // 修改
config.version = "2.1"; // 新增
config["debug"] = true; // 新增(等价)
delete config.debug; // 删除
为什么有时读不到刚设的属性?
常见于异步或原型链干扰:
立即学习“Java免费学习笔记(深入)”;
- 属性写在了原型上(比如通过
Object.prototype.xxx = ...),但你用for...in遍历时没加hasOwnProperty判断,误以为是自有属性 - 对象是 Proxy 或 Vue/React 的响应式代理,属性访问被拦截,需确认是否触发了 getter
- 属性名拼写不一致:大小写、下划线、空格差异(如
user.FirstNamevsuser.firstName) - 对象本身是
null或undefined,但你忘了检查就直接访问,报错中断执行
调试时优先用 console.log(Object.keys(obj)) 看实际有哪些自有属性,比盲目猜更可靠。











