object.fromentries()可一步将map转为普通对象,但要求键为字符串、数字或布尔值等可字符串化类型,symbol键会被跳过,对象键转为"[object object]";值不递归处理,嵌套结构原样保留;配合object.entries()可双向转换,生成对象无原型和不可枚举属性。

直接用 Object.fromEntries() 就能一步把 Map 转成普通对象,前提是 Map 的键都是合法的字符串或可转为字符串的值(比如数字、布尔值),且没有 Symbol 键。
确保 Map 的键适合做对象属性名
Object.fromEntries() 会自动将键转为字符串。例如:
-
new Map([['name', 'Alice'], [1, 'one'], [true, 'yes']])→{ name: 'Alice', '1': 'one', 'true': 'yes' } - 但如果 Map 中有
Symbol('id')或{}这类无法被字符串化为有效属性名的键,转换后会丢失或报错(实际中会跳过 Symbol 键,而对象键会被转成[object Object],容易引发歧义)
处理嵌套结构或特殊类型值
Object.fromEntries() 只负责“键值对”的扁平映射,不递归处理值。如果 Map 的值本身是 Map、数组或 Date 等,它们会原样保留:
-
new Map([['user', new Map([['age', 25]])]])→{ user: Map(1) { 'age' => 25 } } - 如需深度还原(比如把子 Map 也转对象),得配合递归函数或
JSON.parse(JSON.stringify())(注意该方法会丢掉函数、undefined、Date 等)
与 Object.entries() 配合实现双向转换
Map → 对象用 Object.fromEntries();反过来,对象 → Map 可用 new Map(Object.entries(obj)):
const obj = { a: 1, b: 2 }; const map = new Map(Object.entries(obj));- 再执行
Object.fromEntries(map),就能还原回原对象(注意:顺序可能变化,因为对象属性遍历顺序在 ES2015+ 中对字符串键是插入顺序,但对数字键仍按升序)
注意不可枚举属性和原型链
Object.fromEntries() 生成的是纯净 plain object,没有原型方法,也没有不可枚举属性:
- 它不会继承
obj.__proto__上的方法,也不会包含Object.defineProperty(obj, 'hidden', { enumerable: false })定义的属性 - 如果你需要保留某些元信息,得额外记录或使用
Object.assign({}, obj)等方式,而不是依赖 fromEntries










