object.fromentries()是es2019引入的静态方法,用于将map或二维数组等键值对列表直接转为对象,语义明确、一行解决、支持symbol键和有序性,重复键取后者。

Object.fromEntries() 是 ES2019 引入的静态方法,专为将键值对列表(如 Map 或二维数组)转为普通对象而设计。它正好能干净、直接地把 Map 实例还原成字面量对象,无需手动遍历或 reduce。
为什么用 fromEntries() 而不是 for...of 或 Object.assign?
传统方式容易冗余或出错:
– 手动 for...of 需要新建空对象并逐个赋值;
– Object.assign({}, ...map) 在某些旧环境不兼容,且语义不够清晰;
– fromEntries() 语义明确、一行解决、原生支持迭代器,且能正确处理 Symbol 键和重复键(后者取最后出现的)。
基础用法:Map → 对象
只要 Map 的键是字符串、Symbol 或可转为字符串的类型(如数字),就能直接转换:
const map = new Map([
['name', 'Alice'],
['age', 30],
[Symbol('id'), 'abc123']
]);
const obj = Object.fromEntries(map);
// { name: 'Alice', age: 30, [Symbol(id)]: 'abc123' }
注意边界情况
- 如果 Map 中有非字符串/非 Symbol 的键(比如对象、NaN),会被自动转为字符串:
Object.fromEntries(new Map([[{}, 'val']]))→{ '[object Object]': 'val' } - 键重复时,后出现的条目会覆盖前面的:
new Map([['a', 1], ['a', 2]])→{ a: 2 } - Map 是有序的,生成的对象属性顺序与 Map 插入顺序一致(ES2015+ 规范保证)
配合其他操作快速构建对象
常与 Array.prototype.filter、map 等组合使用,实现条件转换:
// 只保留 age >= 25 的字段 const filteredObj = Object.fromEntries( [...map].filter(([key, val]) => key === 'age' && val >= 25) ); // 把所有值转为字符串 const stringified = Object.fromEntries( [...map].map(([k, v]) => [k, String(v)]) );










