[链接]()### 基本用法
转为对象以后具备 [Iterator 接口](https://blog.csdn.net/li1484155613/article/details/102171103),要么本身就具备 Iterator 接口
```
function* fibs() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
let [first, second, third, fourth, fifth, sixth] = fibs();
sixth // 5
```
*****
## 对象的解构赋值
对象的解构与数组有一个重要的不同,变量必须与属性同名,才能取到正确的值
```
let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"
let { baz } = { foo: 'aaa', bar: 'bbb' };
baz // undefined
```
三次解构赋值,分别是对`loc`、`start`、`line`三个属性的解构赋值,只有`line`是变量,`loc`和`start`都是模式,不是变量。
```
const node = {
loc: {
start: {
line: 1,
column: 5
}
}
};
let { loc, loc: { start }, loc: { start: { line }} } = node;
line // 1
loc // Object {start: Object}
start // Object {line: 1, column: 5}
```
对象的解构赋值可以取到继承的属性
```
const obj1 = {};
const obj2 = { foo: 'bar' };
Object.setPrototypeOf(obj1, obj2);
const { foo } = obj1;
foo // "bar"
```
对象`obj1`的原型对象是`obj2`。`foo`属性不是`obj1`自身的属性,而是继承自`obj2`的属性,解构赋值可以取到这个属性