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.prototypeObject.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