destructuring 解构赋值

解构也叫解构化赋值:解构过程中,具备赋值和变量声明两个功能。目的在于把等号左右长的相似的两个东西内部的值取出来

数组解构赋值

基本用法

  1. // 可以从数组中提取值,按照对应位置,对变量赋值。
  2. let [a, b, c] = [1, 2, 3];
  3. // 模式匹配 解构
  4. let [a, [[b], c]] = [1, [[2], 3]];
  5. a // 1
  6. b // 2
  7. c // 3
  8. let [ , , a] = ["1", "2", "3"];
  9. a // "3"
  10. let [a, , c] = [1, 2, 3];
  11. a // 1
  12. c // 3
  13. let [a, ...b] = [1, 2, 3, 4];
  14. a // 1
  15. b // [2, 3, 4]
  16. let [a, b, ...c] = ['1'];
  17. a // "1"
  18. b // undefined 如果解构不成功,变量的值就等于undefined。
  19. c // []
  20. let [b] = [];
  21. let [a, b] = [1];
  22. // b的值都会等于undefined
  23. let [a, [b], c] = [1, [2, 3], 4];
  24. a // 1
  25. b // 2
  26. c // 4
  27. // 属于不完全解构,但是可以成功
  28. let [a, b, c] = new Set(['a', 'b', 'c']);
  29. a // "a" 对于 Set 结构,也可以使用数组的解构赋值。
  30. 事实上只要数据结构具有 遍历器(Iterator) 接口,都可以采用数组形式的解构赋值。

数组可以使用默认值

  1. let [a = true] = [];
  2. a // true
  3. let [a, b = 'b'] = ['a']; // a='a', b='b'
  4. let [a, b = 'b'] = ['a', undefined]; // a='a', b='b'

对象解构赋值

基本用法

  1. let { a, b } = { a: 'aaa', b: 'bbb' };
  2. a // "aaa"
  3. b // "bbb"

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值

  1. let { b, a } = { a: 'aaa', b: 'bbb' };
  2. a // "aaa"
  3. b // "bbb"
  4. let { c } = { a: 'aaa', b: 'bbb' };
  5. c // undefined

对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。

  1. const { log } = console;
  2. log('hello') // hello

变量名与属性名不一致,必须写成下面这样

  1. let { a: c } = { a: 'aaa', b: 'bbb' };
  2. c // "aaa"

默认值

  1. let {a, b = 5} = {a: 1};
  2. a // 1
  3. b // 5
  4. let {a: b = 3} = {a: 5};
  5. b // 5

字符串解构赋值

基本用法

  1. const [a, b, c, d, e, f, g] = 'wuyanzu';
  2. /*
  3. a: w,
  4. b: u,
  5. c: y,
  6. d: a,
  7. e: n,
  8. f: z,
  9. g: u
  10. */
  11. const {length: len} = 'wuyanzu';
  12. console.log(len) // 输出 7

解构赋值的原理是,如果等号右边的值不是对象或数组,就先将其转为对象。对于 undefinednull 这两个无法转成对象,所以没有办法解构,会报 // TypeError

函数解构赋值

基本用法

  1. function sum([a, b]){
  2. return a + b;
  3. }
  4. sum([1, 2]); // 3

sum 函数里面的参数是个数组,里面的 1,2 会被 a,b 给解构

默认值

  1. function box(a = 0, b = 0) {
  2. return (x, y);
  3. }
  4. box(3,8); // 3, 8
  5. box(3); // 3, 0
  6. box(); // [0, 0]