Object.create(null)和{}(对象字面量)的核心区别
在JavaScript中,Object.create(null)
和{}
(对象字面量)的核心区别体现在原型链继承、属性访问行为及使用场景三个维度,具体差异如下:
1. 原型链继承差异
{}
(对象字面量)
通过{}
创建的对象默认继承自Object.prototype
,因此会包含toString()
、hasOwnProperty()
、valueOf()
等内置方法。例如:const obj = {}; console.log(obj.toString); // 输出:[Function: toString] console.log(Object.getPrototypeOf(obj)); // 输出:Object.prototype
Object.create(null)
创建的对象没有原型链(__proto__
为null
),不继承任何Object.prototype
的方法,是一个“纯净”的空对象:const obj = Object.create(null); console.log(obj.toString); // 输出:undefined console.log(Object.getPrototypeOf(obj)); // 输出:null
2. 属性访问与冲突风险
原型污染风险
使用{}
时,若对象属性名与原型方法名冲突(如hasOwnProperty
),可能意外覆盖原型方法,导致逻辑错误:const obj = { hasOwnProperty: true }; obj.hasOwnProperty('key'); // 报错:TypeError: obj.hasOwnProperty is not a function
而
Object.create(null)
的对象因无原型,需手动定义所有方法,避免此类问题。性能差异
{}
的创建速度通常快于Object.create(null)
,且内存占用更低(尤其在大量创建对象时)。但实际性能差异因JavaScript引擎优化而异,日常场景中影响可忽略。
3. 使用场景建议
优先使用
{}
的场景- 需要继承
Object.prototype
方法(如toString
、hasOwnProperty
)的通用对象。 - 代码简洁性优先的场景(如快速创建配置对象、数据结构)。
- 需要继承
优先使用
Object.create(null)
的场景- 避免原型污染:如处理用户输入、动态属性名或需严格隔离的键值存储(如Map替代方案)。
- 性能敏感场景:在极端性能优化中,减少原型链查找开销。
- 类型安全:配合TypeScript等静态类型检查,避免原型方法干扰类型推断。
4. 其他对比维度
- 代码可读性:
{}
更直观,适合大多数开发场景;Object.create(null)
需显式声明意图,适合特定需求。 - 扩展性:
Object.create()
支持自定义原型(如Object.create({})
),而{}
始终继承Object.prototype
。
总结:若无特殊需求,推荐使用{}
(简洁高效);当需要绝对纯净的对象或避免原型链干扰时,选择Object.create(null)
。理解两者的差异有助于编写更健壮、可维护的JavaScript代码。
本文地址:https://www.tides.cn/p_js-the-difference-between-object-create-null-and-literal