ECMAScript 6(3)变量的解构赋值

女爷i 2021-09-19 12:52 358阅读 0赞

目录

变量的解构赋值

数组的解构赋值

  1. 常规赋值

  2. 嵌套数组

  3. 右边不是数组 (报错)

  4. set 解构

    1. 具有 Iterator 接口

带默认值的数组解构赋值

  1. 常规情况

  2. 哪种情况下默认值生效

    对象的解构赋值

  3. 常规情况

  4. 变量名就是key

    1. 解构失败
  5. 解构赋值时,赋值形式并非深度复制

  6. 对已有变量进行解构赋值

    1. 用解构赋值可以方便的取出其他对象中的某个方法或属性
  7. 左边数组右边只能是数组;左边对象,右边可以是数组,或对象

    1. 默认值

字符串的解构赋值

数值和布尔值的解构赋值

函数参数的解构赋值

常规情况

默认值

解构赋值的用途

  1. 交换变量的值

  2. 从函数返回多个值

  3. 函数参数的定义

  4. 提取 JSON 数据

  5. 函数参数的默认值

  6. 遍历 Map 结构

  7. 输入模块的指定方法


变量的解构赋值

  1. 简单的来说,就是等号左右两边的数组/结构类似时,将右边的值直接赋给左边对应位置的变量;
  2. 主要面对的是数组和对象;

数组的解构赋值

1. 常规赋值

  1. let [a, b, c] = [1, 2, 3];
  2. a; //1
  3. b; //2
  4. c; //3

2. 嵌套数组

  1. let [foo, [[bar], baz]] = [1, [[2], 3]];
  2. foo // 1
  3. bar // 2
  4. baz // 3
  5. let [ , , third] = ["foo", "bar", "baz"];
  6. third // "baz"
  7. let [x, , y] = [1, 2, 3];
  8. x // 1
  9. y // 3
  10. let [head, ...tail] = [1, 2, 3, 4];
  11. head // 1
  12. tail // [2, 3, 4]
  13. let [x, y, ...z] = ['a'];
  14. x // "a"
  15. y // undefined 如果解构不成功,变量的值就等于undefined。
  16. z // []

3. 右边不是数组 (报错)

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

4. set 解构

  1. let [x, y, z] = new Set(['a', 'b', 'c']);
  2. x // "a"

5. 具有 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();
  10. sixth // 5

带默认值的数组解构赋值

1. 常规情况

  1. var [a, b = 2, c, d = 10]=[1, , 3, 4];
  2. a; //1
  3. b; //2
  4. c; //3
  5. d; //4

2. 哪种情况下默认值生效

ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效

  1. var [a = 1] = [undefined]; //1
  2. var [a = 1] = [null]; //null
  3. var [a = 1] = [3]; //3
  4. var [a = 1] = ["abc"]; //"abc"
  5. var [a = 1] = [{m: 1}]; //{m:1}
  6. var [a = 1] = [true]; //true
  7. var [a = 1] = [NaN]; //NaN

对象的解构赋值

  1. 简单来说,对象解构是根据key给变量赋值该key的value,数组解构是根据顺序给对应位置的变量赋值;

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

1. 常规情况

  1. var {'abc': a} = {'abc': 1};
  2. a; //1

2. 变量名就是key

  1. var {abc} = {'abc': 1};
  2. abc; //1

ps : 对象中key 和value相同可以简写成 ,上面的代码实质就是

  1. var {abc: abc} = {'abc': 1};

3. 解构失败

如果解构失败,变量的值等于undefined

简单来说就是, 左边的变量 在右边没有对应的key

  1. let {foo} = {bar: 'baz'};
  2. foo // undefined

4. 解构赋值时,赋值形式并非深度复制

  1. var a = {
  2. b: {c: 1}
  3. };
  4. a.b.c; //1
  5. var {b} = a;
  6. b.c; //1
  7. b.c = 2;
  8. b.c; //2
  9. a.b.c; //2

5. 对已有变量进行解构赋值

  1. // 错误的写法
  2. let x;
  3. {x} = {x: 1};
  4. // SyntaxError: syntax error

上面代码的写法会报错,因为 JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。

  1. // 正确的写法
  2. let x;
  3. ({x} = {x: 1});

6. 用解构赋值可以方便的取出其他对象中的某个方法或属性

  1. var computed = {
  2. add: function (a, b) {
  3. return a + b;
  4. },
  5. minus: function (a, b) {
  6. return a - b;
  7. }
  8. };
  9. var {add, minus} = computed;
  10. add(2, 3);
  11. minus(2, 3);

7. 左边数组右边只能是数组;左边对象,右边可以是数组,或对象

假如有一个数组arr,那么arr[0]就是数组的第一个元素,arr[1]就是数组的第二个元素,0和1就是这个数组的key

  1. var arr = [2, 4, 6, 8];
  2. var {
  3. 0:a,
  4. 1:b,
  5. [arr.length - 1]:d,
  6. [arr.length - 2]:c
  7. }= arr;
  8. a; //2
  9. b; //4
  10. c; //6
  11. d; //8

但相反情况下,是不可以的。

  1. var obj = {
  2. 0: 1,
  3. 1: 2
  4. }
  5. var [a,b] = obj; //Uncaught TypeError: undefined is not a function

8. 默认值

  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"

默认值生效的条件是,对象的属性值严格等于undefined

  1. var {x = 3} = {x: undefined};
  2. x // 3
  3. var {x = 3} = {x: null};
  4. 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"

类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。

  1. let {length : len} = 'hello';
  2. len // 5

数值和布尔值的解构赋值

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

解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。

  1. let {toString: s} = 123;
  2. s === Number.prototype.toString // true
  3. let {toString: s} = true;
  4. s === Boolean.prototype.toString // true

上面代码中,数值和布尔值的包装对象都有toString属性,因此变量s都能取到值。

由于undefinednull无法转为对象都会报错。

  1. let { prop: x } = undefined; // TypeError
  2. let { prop: y } = null; // TypeError

函数参数的解构赋值

  1. 函数参数可以解构赋值,解构方法和上面相同。
  2. 函数参数可以有默认值 。

常规情况

  1. function add([x, y]){
  2. return x + y;
  3. }
  4. add([1, 2]); // 3

默认值

  1. function add({x=10, y=20}) {
  2. return x + y;
  3. }
  4. add({x: 1, y: 2}); //3
  5. add({x: 1}); //21
  6. add({}); //30

解构赋值的用途

1. 交换变量的值

  1. let x = 1;
  2. let y = 2;
  3. [x, y] = [y, x];

2. 从函数返回多个值

  1. // 返回一个数组
  2. function example() {
  3. return [1, 2, 3];
  4. }
  5. let [a, b, c] = example();
  6. // 返回一个对象
  7. function example() {
  8. return {
  9. foo: 1,
  10. bar: 2
  11. };
  12. }
  13. let { foo, bar } = example();

3. 函数参数的定义

  1. // 参数是一组有次序的值
  2. function f([x, y, z]) { ... }
  3. f([1, 2, 3]);
  4. // 参数是一组无次序的值
  5. function f({x, y, z}) { ... }
  6. f({z: 3, y: 2, x: 1});

4. 提取 JSON 数据

解构赋值对提取 JSON 对象中的数据,尤其有用。

  1. let jsonData = {
  2. id: 42,
  3. status: "OK",
  4. data: [867, 5309]
  5. };
  6. let { id, status, data: number } = jsonData;
  7. console.log(id, status, number);
  8. // 42, "OK", [867, 5309]

5. 函数参数的默认值

  1. jQuery.ajax = function (url, {
  2. async = true,
  3. beforeSend = function () {},
  4. cache = true,
  5. complete = function () {},
  6. crossDomain = false,
  7. global = true,
  8. // ... more config
  9. } = {}) {
  10. // ... do stuff
  11. };

指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || 'default foo';这样的语句。

6. 遍历 Map 结构

  1. const map = new Map();
  2. map.set('first', 'hello');
  3. map.set('second', 'world');
  4. for (let [key, value] of map) {
  5. console.log(key + " is " + value);
  6. }
  7. // first is hello
  8. // second is world

如果只想获取键名,或者只想获取键值,可以写成下面这样。

  1. // 获取键名
  2. for (let [key] of map) {
  3. // ...
  4. }
  5. // 获取键值
  6. for (let [,value] of map) {
  7. // ...
  8. }

7. 输入模块的指定方法

加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。

  1. const { SourceMapConsumer, SourceNode } = require("source-map");

发表评论

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

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

相关阅读

    相关 变量赋值

    变量的解构赋值 > ES6 允许按照一定模式, 从数组和对象中提取值, 对变量进行赋值, 这被称为解构(Destructruing) 一. 数组的解构赋值 1.

    相关 变量赋值

    ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。只要某种数据结构具有Iterator接口,都可以进行解构。解构的规则是