解构赋值解密:小白程序员的入门指南(上)

119 阅读5分钟

JavaScript 中的解构赋值是一项神奇而实用的技能,它让你以更简洁的方式处理数据。本文将深入浅出地介绍解构赋值,专为小白程序员而写。通过本文的学习,你将能够轻松驾驭解构赋值,为你的 JavaScript 编程之旅增添一抹亮色。

数组的解构赋值

JavaScript 中的数组解构赋值是一项强大而灵活的特性,它允许你从数组中提取值,并将这些值赋给变量。这个特性为代码编写提供了更简洁、清晰的语法。在本节中,我们将深入讨论数组解构赋值的基本用法以及一些实用技巧。

1.1 基本用法

数组解构赋值的基本语法是使用方括号[],将待赋值的变量放在等号左边,而数组则放在等号右边。让我们看一个简单的例子:

// 基本用法
let [a, b, c] = [1, 2, 3];
// a = 1, b = 2, c = 3

通过这个例子,我们成功地从数组中提取了值,并将它们分别赋给了变量 abc

1.2 嵌套数组的解构

数组解构赋值同样适用于嵌套数组的情况。嵌套数组指的是数组中包含其他数组。看下面的例子:

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

通过这个例子,我们成功地解构了嵌套数组,将其中的值分别赋给了变量 foobarbaz

1.3 默认值

解构赋值允许为变量设置默认值,当解构的值为 undefined 时,变量将取默认值。例如:

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

在这个例子中,由于数组的第一个元素是 undefined,变量 x 取到了默认值 1。

1.4 不完全解构

解构赋值也支持不完全解构,即等号左边的模式只匹配部分等号右边的数组。这种情况下,解构仍然可以成功。

let [m, n] = [1, 2, 3];
// m = 1, n = 2

在这个例子中,虽然数组包含三个元素,但只有前两个被成功解构。

1.5 解构不成功的情况

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

let [foo] = [];
// foo = undefined

在这个例子中,由于数组为空,变量 foo 的值等于 undefined

1.6 解构赋值应用于其他数据结构

除了数组,解构赋值也适用于 Set 结构等具有可迭代性质的数据结构。

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

在这个例子中,我们通过解构赋值从 Set 结构中提取了值。

1.7 懒惰求值

如果解构赋值的默认值是一个表达式,这个表达式只有在解构失败时才会被求值。

function f() {
  console.log('aaa');
  return 1;
}

let [x = f()] = [];
// x = 1

在这个例子中,由于数组为空,解构赋值的默认值才被懒惰地求值,因此 f 函数并未执行。

对象的解构赋值

2.1 基本用法

对象解构赋值的基本语法使用花括号 {},将待赋值的变量与对象的属性名对应起来,实现值的提取和赋值。以下是一个简单的例子:

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

在这个例子中,我们成功地从对象中提取了属性值,并将它们分别赋给了变量 foobar

2.2 嵌套对象的解构

对象解构赋值同样适用于嵌套对象的情况。嵌套对象是指对象中包含其他对象。看下面的例子:

let obj = { p: { x: 1, y: 2 } };
let { p: { x, y } } = obj;
// x = 1, y = 2

通过这个例子,我们成功地解构了嵌套对象,将其中的属性值分别赋给了变量 xy

2.3 默认值

对象解构赋值同样允许为变量设置默认值。当解构的属性值为 undefined 时,变量将取默认值。例如:

let { x = 0, y = 0 } = { y: 3 };
// x = 0, y = 3

在这个例子中,由于对象中没有属性 x,因此变量 x 取到了默认值 0。

2.4 不致的解构

如果解构赋值的属性名与变量名不一致,可以使用冒号来进行匹配。

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

在这个例子中,我们通过冒号将对象属性 foo 的值赋给了变量 baz

2.5 解构不成功的情况

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

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

在这个例子中,由于对象中没有属性 foo,因此变量 foo 的值等于 undefined

2.6 解构赋值应用于其他数据结构

与数组解构类似,对象解构赋值同样适用于 Set 结构等具有可迭代性质的数据结构。

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

在这个例子中,我们通过解构赋值从 Set 结构中提取了值。

2.7 对象解构赋值的内部机制

对象解构赋值的内部机制是先找到同名属性,然后再将属性值赋给对应的变量。这一点需要注意。

let { foo: baz } = { foo: "aaa", bar: "bbb" };
// baz = "aaa", foo = error: foo is not defined

在这个例子中,虽然我们使用 foo 作为匹配模式,但实际被赋值的是变量 baz,而不是 foo

2.8 对象解构赋值与数组解构赋值的区别

对象解构赋值与数组解构赋值有着一些重要的区别,主要体现在对属性名的匹配上。在对象解构中,匹配是通过属性名实现的,而在数组解构中,是通过位置实现的。

[下一部分](解构赋值解密:小白程序员的入门指南(下) - 掘金 (juejin.cn))