结构赋值依赖可迭代对象的[Symbol.iterator]方法自动调用迭代器提取值;数组、字符串、Map、Set等内置类型默认可迭代,自定义对象需手动实现该方法才能解构。

JavaScript 中迭代器本身不直接参与结构赋值,但可迭代对象(即实现了 [Symbol.iterator] 方法的对象)可以和结构赋值配合使用——因为结构赋值会自动调用该对象的默认迭代器来提取值。
结构赋值依赖迭代器协议
当对一个对象进行数组解构(如 const [a, b] = iterable;)时,JavaScript 引擎会检查右侧值是否为可迭代对象:它必须拥有 [Symbol.iterator] 方法,且该方法返回一个符合迭代器协议的对象(含 next() 方法)。只有满足这个条件,解构才能按顺序取前几个 value。
常见可迭代对象的解构示例
以下写法都成立,背后都是迭代器在工作:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
数组解构:
const [x, y] = [10, 20];→ 数组自带[Symbol.iterator],每次next()返回下一个元素 -
字符串解构:
const [a, b] = "hi";→ 字符串按字符迭代,结果是a === "h",b === "i" -
Map 解构键值对:
const map = new Map([["a", 1], ["b", 2]]); const [[k1, v1], [k2, v2]] = map;→map[Symbol.iterator]()等价于map.entries(),返回键值对数组 -
Set 解构:
const set = new Set([3, 5]); const [first, second] = set;→ 按插入顺序依次取出值
自定义对象支持解构的关键
要让自己的对象能用于结构赋值,只需在对象上部署 [Symbol.iterator] 方法:
立即学习“Java免费学习笔记(深入)”;
const counter = {
from: 1,
to: 3,
[Symbol.iterator]() {
let current = this.from;
return {
next() {
if (current <= this.to) {
return { value: current++, done: false };
}
return { done: true };
}
};
}
};
const [a, b, c] = counter; // a=1, b=2, c=3
注意边界情况
解构过程中不会报错,但行为取决于迭代器返回值:
- 如果迭代器提前返回
{done: true},对应位置得到undefined(如const [x, y] = [1];→y === undefined) - 迭代器返回
value: undefined且done: false,解构也会接收这个undefined - 普通对象(非可迭代)不能直接数组解构:
const obj = {a:1}; const [x] = obj;会报TypeError: obj is not iterable

















