JavaScript对象是键值对无序集合,属性默认可读写、可枚举、可配置;字面量{}最安全,Object.create(null)创建无原型对象;点号用于静态合法标识符,方括号用于动态或特殊键名;delete仅对自身且configurable为true的属性生效;for...in需hasOwnProperty过滤原型属性。

JavaScript 对象不是“类实例”或“模板产物”,它本质上是一组键值对的无序集合,所有属性默认可读写、可枚举、可配置——除非你显式用 Object.defineProperty 改变描述符。
对象字面量和构造函数创建的区别在哪
两种方式最终都生成普通对象,但行为细节不同:
-
{}字面量创建的对象,其[[Prototype]]指向Object.prototype,是最常用也最安全的方式 -
new Object()本质等价于字面量,但多一层函数调用开销,且容易被误写成new Object(123)导致意外包装(返回Number实例而非普通对象) -
Object.create(null)创建的是“真·空对象”:没有toString、hasOwnProperty等任何继承方法,适合做纯哈希表(比如缓存 key 映射),但调用obj.toString()会直接报TypeError: obj.toString is not a function
访问属性时点号和方括号怎么选
点号(.)要求属性名是合法标识符且已知;方括号([])支持动态计算、含特殊字符或保留字的键名:
- 能用
obj.name就别写obj["name"]—— 前者更快、更易读、支持 IDE 自动补全 - 当属性名来自变量、含空格或短横线(如
"user-id")、是数字字符串("123")或关键字("class")时,必须用obj[key] -
obj[123]和obj["123"]访问的是同一个属性,因为数字键会被自动转为字符串
删除属性为什么 delete obj.prop 有时不生效
delete 只能移除对象自身、且 configurable: true 的属性。常见失效场景:
立即学习“Java免费学习笔记(深入)”;
- 属性由
Object.defineProperty设置了configurable: false(例如Array.prototype.push)→delete arr.push返回false,属性仍在 - 访问器属性(
get/set)本身不可删,但可以删掉整个描述符定义(前提是 configurable 为 true) - 全局环境下用
var声明的变量会成为全局对象的不可配置属性(delete window.xxx失败);let/const声明的则根本不在全局对象上,delete无意义
for...in 遍历对象要注意什么
for...in 枚举的是对象**自身 + 原型链上所有可枚举(enumerable: true)的字符串键属性**,这常导致意外结果:
- 必须配合
hasOwnProperty过滤原型属性:if (obj.hasOwnProperty(key)) { ... } - 不能保证遍历顺序:ES2015 规定数字键按升序,其余字符串键按插入顺序,但老引擎(如 IE)不保证
- 想只遍历自身属性,更推荐
Object.keys(obj)(返回字符串数组)或Object.getOwnPropertyNames(obj)(包含不可枚举属性)
真正难的不是语法,而是理解属性描述符(writable/enumerable/configurable)如何影响操作结果——比如 Object.freeze 实际就是把所有自身属性设为 writable: false 和 configurable: false,之后任何赋值或删除都会静默失败(严格模式下报错)。










