解构赋值规则

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。

可结构数据

只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值

  1. function* fibs() {
  2. let a = 0;
  3. let b = 1;
  4. while (true) {
  5. yield a;
  6. [a, b] = [b, a + b];
  7. }
  8. }
  9. let [first, second, third, fourth, fifth, sixth] = fibs()

数组默认值

1、=== undefined ,null是空值,不是没值
2、默认值可以是变量

对象的三次解构赋值

  1. const node = {
  2. loc: {
  3. start: {
  4. line: 1,
  5. column: 5
  6. }
  7. }
  8. };
  9. let { loc, loc: { start }, loc: { start: { line }} } = node;

对象嵌套赋值

  1. let obj = {};
  2. let arr = [];
  3. ({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true });
  4. obj // {prop:123}
  5. arr // [true]

对象的解构赋值可以取到继承的属性

  1. const obj1 = {};
  2. const obj2 = { foo: 'bar' };
  3. Object.setPrototypeOf(obj1, obj2);
  4. const { foo } = obj1;
  5. foo // "bar"

对象的默认值

  1. var { message: msg = 'Something went wrong' } = {};

语法

1、赋值表达式,一定要加()

  1. let x;
  2. {x} = { x:1 } //err
  3. ({x} = {x:1})

2、数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
属性名表达式(参见《对象的扩展》)

  1. let arr = [1, 2, 3];
  2. let {0 : first, [arr.length - 1] : last} = arr;
  3. first // 1
  4. last // 3

3、不要使用()
以下三种解构赋值不得使用圆括号

  • 变量声明语句 【不可以】
  • 赋值语句,而不是声明语句 【可以】
    1. let [(b)] = [3]; // 不正确
    2. [(b)] = [3]; // 正确
    4、Map ```javascript const map = new Map(); map.set(‘first’, ‘hello’); map.set(‘second’, ‘world’);

for (let [key, value] of map) { console.log(key + “ is “ + value); }

// 获取键名 for (let [key] of map) { // … }

// 获取键值 高手 for (let [,value] of map) { // … } ```