ES6语法:解构赋值【数组&对象】

ECMAScript6 知识整理

  • 1 文章简介
  • 2 主要内容
    • 2.1 关于解构赋值
      • 2.1.1 概述
      • 2.1.2 解构模型
    • 2.2 数组的结构赋值
      • 2.2.1 基本用法
      • 2.2.2 默认值
      • 2.2.3 总结归纳
        • 2.2.3.1 基本
        • 2.2.3.2 可嵌套
        • 2.2.3.3 可忽略
        • 2.2.3.4 不完全解构
        • 2.2.3.5 剩余运算符
        • 2.3.3.6 解构默认值
    • 2.3 对象的结构赋值
      • 2.3.1 简介
      • 2.3.2 默认值
      • 2.3.3 注意点
      • 2.3.4 总结归纳
        • 2.3.4.1 基本
        • 2.3.4.2 可嵌套可忽略
        • 2.3.4.3 不完全解构
        • 2.3.4.4 剩余运算符
        • 2.3.4.5 解构默认值
    • 课程代码示例截图
      • 对象的解构
      • 数组的解构
  • 下期预告
  • summary

1 文章简介

本文是关于es6中变量的解构赋值的相关基础知识整理,用于知识分享和个人笔记记录。接上篇关于let和const命令内容。
ES6语法:解构赋值【数组&对象】_第1张图片

2 主要内容

2.1 关于解构赋值

2.1.1 概述

解构赋值是对赋值运算符的扩展。
它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。

2.1.2 解构模型

在解构中,有下面两部分参与:

  • 解构的源,解构赋值表达式的右边部分。
  • 解构的目标,解构赋值表达式的左边部分。

2.2 数组的结构赋值

2.2.1 基本用法

从数组和对象中提取值,对变量进行赋值,这被称为解构.

以前,为变量赋值,只能直接指定值。

let a = 1;
let b = 2;
let c = 3;

ES6 :

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

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

这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

下面是一些使用嵌套数组进行解构的例子。

let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3

let [ , , third] = ["foo", "bar", "baz"];
third // "baz"

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

let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]

let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []

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

let [foo] = [];
let [bar, foo] = [1];

以上两种情况都属于解构不成功,foo的值都会等于undefined。

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

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

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

上面两个例子,都属于不完全解构,但是可以成功。

如果等号的右边不是数组(或者严格地说,不是可遍历的结构,参见《Iterator》一章),那么将会报错。

// 报错
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};

上面的语句都会报错,因为等号右边的值,要么转为对象以后不具备 Iterator 接口(前五个表达式),要么本身就不具备 Iterator 接口(最后一个表达式)。

对于 Set 结构,也可以使用数组的解构赋值。

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

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

2.2.2 默认值

解构赋值允许指定默认值。

let [foo = true] = [];
foo // true

let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'

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

let [x = 1] = [undefined];
x // 1

let [x = 1] = [null];
x // null

上面代码中,如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined

2.2.3 总结归纳

2.2.3.1 基本
let [a, b, c] = [1, 2, 3];
// a = 1
// b = 2
// c = 3
2.2.3.2 可嵌套
let [a, [[b], c]] = [1, [[2], 3]];
// a = 1
// b = 2
// c = 3
2.2.3.3 可忽略
let [a, , b] = [1, 2, 3];
// a = 1
// b = 3
2.2.3.4 不完全解构
let [a = 1, b] = []; // a = 1, b = undefined
2.2.3.5 剩余运算符
let [a, ...b] = [1, 2, 3];
//a = 1
//b = [2, 3]
2.3.3.6 解构默认值
let [a = 2] = [undefined]; // a = 2

当解构模式有匹配结果,且匹配结果是 undefined 时,会触发默认值作为返回结果。

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

a 与 b 匹配结果为 undefined ,触发默认值:a = 3; b = a =3
a 正常解构赋值,匹配结果:a = 1,b 匹配结果 undefined ,触发默认值:b = a =1
a 与 b 正常解构赋值,匹配结果:a = 1,b = 2

2.3 对象的结构赋值

2.3.1 简介

解构不仅可以用于数组,还可以用于对象。

let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"

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

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

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

上面代码中,等号右边的对象没有foo属性,所以变量foo取不到值,所以等于undefined。

2.3.2 默认值

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

var {x = 3} = {};
x // 3

var {x, y = 5} = {x: 1};
x // 1
y // 5

var {x: y = 3} = {};
y // 3

var {x: y = 3} = {x: 5};
y // 5

var { message: msg = 'Something went wrong' } = {};
msg // "Something went wrong"

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

var {x = 3} = {x: undefined};
x // 3

var {x = 3} = {x: null};
x // null

上面代码中,属性x等于null,因为null与undefined不严格相等,所以是个有效的赋值,导致默认值3不会生效。

2.3.3 注意点

1)如果要将一个已经声明的变量用于解构赋值,必须非常小心。

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

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

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

上面代码将整个解构赋值语句,放在一个圆括号里面,就可以正确执行。
2)解构赋值允许等号左边的模式之中,不放置任何变量名。

({} = [true, false]);
({} = 'abc');
({} = []);

上面的表达式虽然毫无意义,但是语法是合法的,可以执行。

3)对数组进行对象属性的解构

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

上面代码对数组进行对象解构。数组arr的0键对应的值是1,[arr.length - 1]就是2键,对应的值是3。方括号这种写法,属于“属性名表达式”。

2.3.4 总结归纳

2.3.4.1 基本
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
// foo = 'aaa'
// bar = 'bbb'
 
let { baz : foo } = { baz : 'ddd' };
// foo = 'ddd'
2.3.4.2 可嵌套可忽略
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { y }] } = obj;
// x = 'hello'
// y = 'world'
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, {  }] } = obj;
// x = 'hello'
2.3.4.3 不完全解构
let obj = {p: [{y: 'world'}] };
let {p: [{ y }, x ] } = obj;
// x = undefined
// y = 'world'
2.3.4.4 剩余运算符
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};
// a = 10
// b = 20
// rest = {c: 30, d: 40}
2.3.4.5 解构默认值
let {a = 10, b = 5} = {a: 3};
// a = 3; b = 5;
let {a: aa = 10, b: bb = 5} = {a: 3};
// aa = 3; bb = 5;

课程代码示例截图

对象的解构

ES6语法:解构赋值【数组&对象】_第2张图片

数组的解构

ES6语法:解构赋值【数组&对象】_第3张图片

下期预告

下期内容主要是关于symbol数据类型的相关基础知识整理,浅浅期待一下吧~

summary

本期内容主要是关于es6变量的解构赋值的相关基础知识整理,包含举例代码较多,需要耐心阅读。文章内容由本人结合所学和相关资料综合整理得出,若有不足和错误,希望大家指出,我会及时改正和更新!

你可能感兴趣的:(ECMAScript6,es6,javascript,前端,开发语言,ecmascript)