解构赋值兼容可迭代对象,依赖其symbol.iterator方法;支持数组、字符串、map、set、类数组及自定义部署迭代器的对象;解构时自动调用next()逐项取值。

解构赋值本身不直接“利用迭代器”,但它天然兼容可迭代对象(Symbol.iterator 实现者),只要目标是可迭代的,就能通过解构语法自动调用其迭代器逐个取值。
哪些数据能被解构?看它有没有迭代器
JavaScript 中支持解构的,不是“所有对象”,而是实现了 Symbol.iterator 方法的对象。常见可迭代类型包括:
- 数组:原生支持,最常用
- 字符串:按字符迭代(注意 Unicode 字符如 emoji 可能占多个码点)
- Map / Set:Map 解构得到 [key, value] 数组,Set 解构得到元素本身
- arguments / NodeList / TypedArray:类数组且实现了迭代器(ES6+ 环境中)
-
自定义对象:只要手动部署
[Symbol.iterator]()方法即可
解构时实际发生了什么?
当你写 const [a, b] = iterable;,引擎会:
- 检查
iterable[Symbol.iterator]是否存在且为函数 - 调用它获取一个迭代器对象(含
next()方法) - 连续调用
next(),把每次返回的value赋给对应位置的变量 - 遇到
{ done: true }或解构项用尽就停止
例如:const [first, , third] = "abc"; → first === "a",跳过第二个,third === "c";背后就是字符串迭代器依次吐出 "a"、"b"、"c"。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
手动控制迭代过程:解构 + rest + 扩展运算符
结合迭代器特性,可以灵活提取部分或剩余数据:
-
取前 N 个 + 剩余全部:
const [a, b, ...rest] = new Set([1,2,3,4,5]);→a=1, b=2, rest=[3,4,5] -
跳过开头再解构:
const [, , x, y] = [..."hello"]; // ["h","e","l","l","o"] → x="l", y="l" -
Map 解构键值对:
const map = new Map([["a", 1], ["b", 2]]); for (const [key, value] of map) { console.log(key, value); }—— 这里的[key, value]就是解构迭代器返回的数组
自定义迭代器让任意对象支持解构
只需在对象上部署 Symbol.iterator 方法,返回一个有 next() 的对象:
const countdown = {
from: 3,
[Symbol.iterator]() {
let current = this.from;
return {
next() {
if (current > 0) {
return { value: current--, done: false };
}
return { value: undefined, done: true };
}
};
}
};
const [a, b, c] = countdown; // a=3, b=2, c=1
这样,countdown 就能像数组一样被解构,本质是解构语法触发了你写的迭代逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










