ES6学习笔记二

秒速五厘米 2021-12-03 17:51 465阅读 0赞

数组的解构赋值

概念:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构

  1. //以前,为变量赋值,只能直接指定值
  2. let a = 1;
  3. let b = 2;
  4. let c = 3;
  5. //ES6解构赋值:
  6. let [a, b, c] = [1, 2, 3];

上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值

  1. //本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些使用嵌套数组进行解构的例子。
  2. let [foo, [[bar], baz]] = [1, [[2], 3]];
  3. foo // 1
  4. bar // 2
  5. baz // 3
  6. let [ , , third] = ["foo", "bar", "baz"];
  7. third // "baz"
  8. let [x, , y] = [1, 2, 3];
  9. x // 1
  10. y // 3
  11. let [head, ...tail] = [1, 2, 3, 4];
  12. head // 1
  13. tail // [2, 3, 4]
  14. let [x, y, ...z] = ['a'];
  15. x // "a"
  16. y // undefined
  17. z // []

如果解构不成功,变量的值就等于undefined

  1. let [foo] = [];
  2. let [bar, foo] = [1];
  3. //以上两种情况都属于解构不成功,foo的值都会等于undefined

另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功

  1. let [x, y] = [1, 2, 3];
  2. x // 1
  3. y // 2
  4. let [a, [b], d] = [1, [2, 3], 4];
  5. a // 1
  6. b // 2
  7. d // 4
  8. //上面两个例子,都属于不完全解构,但是可以成功

如果等号的右边不是数组(或者严格地说,不是可遍历的结构),那么将会报错

  1. // 报错
  2. let [foo] = 1;
  3. let [foo] = false;
  4. let [foo] = NaN;
  5. let [foo] = undefined;
  6. let [foo] = null;
  7. let [foo] = {};

解构赋值允许指定默认值

  1. let [foo = true] = [];
  2. foo // true
  3. let [x, y = 'b'] = ['a']; // x='a', y='b'
  4. let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
  5. //注意,ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。
  6. let [x = 1] = [undefined];
  7. x // 1
  8. let [x = 1] = [null];
  9. x // null
  10. //上面代码中,如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。

对象的解构赋值

  1. let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
  2. foo // "aaa"
  3. bar // "bbb"
  4. let { baz } = { foo: 'aaa', bar: 'bbb' };
  5. baz // undefined
  6. 对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量
  7. // 例一
  8. let { log, sin, cos } = Math;
  9. // 例二
  10. const { log } = console;
  11. log('hello') // hello
  12. 如果变量名与属性名不一致,必须写成下面这样
  13. let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
  14. baz // "aaa"
  15. let obj = { first: 'hello', last: 'world' };
  16. let { first: f, last: l } = obj;
  17. f // 'hello'
  18. l // 'world'

对象的解构也可以指定默认值

  1. var {x = 3} = {};
  2. x // 3
  3. var {x, y = 5} = {x: 1};
  4. x // 1
  5. y // 5
  6. var {x: y = 3} = {};
  7. y // 3
  8. var {x: y = 3} = {x: 5};
  9. y // 5
  10. var { message: msg = 'Something went wrong' } = {};
  11. msg // "Something went wrong"
  12. 默认值生效的条件是,对象的属性值严格等于undefined
  13. var {x = 3} = {x: undefined};
  14. x // 3
  15. var {x = 3} = {x: null};
  16. x // null

字符串的解构赋值

字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象

  1. const [a, b, c, d, e] = 'hello';
  2. a // "h"
  3. b // "e"
  4. c // "l"
  5. d // "l"
  6. e // "o"
  7. 类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值
  8. let {length : len} = 'hello';
  9. len // 5

数值和布尔值的解构赋值

  1. 解构赋值时,如果等号右边是数值和布尔值,则会先转为对象
  2. let {toString: s} = 123;
  3. s === Number.prototype.toString // true
  4. let {toString: s} = true;
  5. s === Boolean.prototype.toString // true

发表评论

表情:
评论列表 (有 0 条评论,465人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6学习笔记

    数组的解构赋值 概念:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构 //以前,为变量赋值,只能直接指定值 let a =