最简洁可靠的方式是用 Object.entries() 配合 Map 构造函数,因其返回可迭代的 [key, value] 数组且仅遍历自身可枚举属性;但会丢失 Symbol 键和不可枚举属性,此时需用 Reflect.ownKeys() 手动构建。

JavaScript中,把普通对象转成 Map 最简洁可靠的方式就是使用 Object.entries() 配合 Map 构造函数。
为什么用 Object.entries()?
Object.entries(obj) 返回一个二维数组,每一项是 [key, value] 形式的键值对,这正好匹配 Map 构造函数所需的可迭代格式。它只遍历对象自身的、可枚举的属性,不包含原型链上的属性,行为明确且安全。
基本写法(一行搞定)
直接传入即可:
const obj = { a: 1, b: 2, c: 3 };
const map = new Map(Object.entries(obj));
结果:map 是一个包含三个键值对的 Map,支持 map.get('a')、map.size、迭代等全部 Map 方法。
立即学习“Java免费学习笔记(深入)”;
注意点和常见坑
-
键会被转为字符串:如果原对象的 key 是数字或 Symbol,
Object.entries()会把数字 key 自动转成字符串(如{ 1: 'x' }→[['1', 'x']]),Symbol key 则被完全忽略(因为不可枚举) -
不处理嵌套或特殊类型:该方法只做浅转换,不会递归处理嵌套对象或转换
Date、RegExp等特殊值 -
丢失不可枚举属性:例如通过
Object.defineProperty设置的enumerable: false属性不会出现在entries结果中
需要保留 Symbol key 或不可枚举属性?
这时得手动遍历:Reflect.ownKeys() 可获取所有自有属性键(含 Symbol 和不可枚举键),再逐个取值构建 Map:
const obj = { a: 1 };
Object.defineProperty(obj, 'hidden', { value: 2, enumerable: false });
const sym = Symbol('s');
obj[sym] = 3;
const map = new Map(
Reflect.ownKeys(obj).map(key => [key, obj[key]])
); // 包含 'a'、'hidden'、Symbol('s')


















