JavaScript对象是键值对的无序容器结构,键为字符串或Symbol,值可为任意类型;点号访问合法标识符属性,方括号支持动态键名;增删改属性分别用赋值、delete操作;读不到属性常因原型链、代理拦截或拼写错误。
它不是某种特殊的数据类型,而是一种**容器结构**——用键(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
效果完全一致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 判断,误以为是自有属性user.FirstName vs user.firstName)null 或 undefined,但你忘了检查就直接访问,报错中断执行调试时优先用 console.log(Object.keys(obj)) 看实际有哪些自有属性,比盲目猜更可靠。