JavaScript对象不可直接迭代,需用Object.keys()、values()、entries()转为数组;也可用Array.from()配合它们或手动添加Symbol.iterator实现迭代。

JavaScript 中对象本身不是可迭代的,不能直接用 for...of 或扩展运算符([...obj])转成数组。但可以通过获取其键、值或键值对,再用 Array.from() 或扩展运算符转换为数组。
用 Object.keys()、Object.values()、Object.entries()
这三个方法返回的都是数组,天然支持迭代器协议,是最常用、最直接的方式:
-
Object.keys(obj)→ 返回字符串键名组成的数组 -
Object.values(obj)→ 返回属性值组成的数组(顺序与keys一致) -
Object.entries(obj)→ 返回[key, value]数组组成的二维数组
例如:
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.keys(obj)); // ['a', 'b', 'c']
console.log(Object.values(obj)); // [1, 2, 3]
console.log(Object.entries(obj)); // [['a', 1], ['b', 2], ['c', 3']] 用 Array.from() 配合 Object.keys/values/entries
虽然上面三个方法已返回数组,但若你想显式通过“迭代器”方式转换(比如练习或封装通用逻辑),可以用 Array.from():
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Array.from(Object.keys(obj))Array.from(Object.values(obj))Array.from(Object.entries(obj))
注意:Array.from() 的第一个参数必须是类数组或可迭代对象;Object.keys 等返回的就是可迭代的数组,所以能用,但属于“多此一举”,除非你后续要加映射函数(第二个参数):
Array.from(Object.entries(obj), ([k, v]) => `${k}:${v}`)
// ['a:1', 'b:2', 'c:3']手动实现可迭代对象并转数组(进阶)
如果你希望对象自身具备迭代能力(如支持 for...of),可以给它添加 Symbol.iterator 方法:
const obj = { x: 10, y: 20 };
obj[Symbol.iterator] = function* () {
for (let key of Object.keys(this)) {
yield this[key];
}
};
<p>console.log([...obj]); // [10, 20]
console.log(Array.from(obj)); // [10, 20]这样对象就变成可迭代的了,之后就能用扩展运算符或 Array.from() 直接转数组。
不推荐:用 for...in + 手动 push
虽然可行,但 for...in 会遍历原型链上的可枚举属性,容易出错:
- 需配合
hasOwnProperty过滤 - 不保证属性顺序(尤其数字键)
- 不符合“迭代器转换”的本意,也失去现代 API 的简洁性

















