JAVASCRIPT distructuring(解构) 详解

JS 解构

       JS结构是ES6的功能 是一种拆解方式,将数组或者对象拆解称为单独的变量。解构就是要分解复杂的数据结构转换为较小的数据结构例如变量等。

1)Array Distructuring(数组解构)

首先对于数组来说,我们使用解构来检索数组之中的元素,并简单的将他们存储到变量之中。

以一个示例(不使用解构)来说:

const arr = [2,3,4];
const a = arr[0];
const b = arr[1];
const c = arr[2];

此段代码将arr数组之中三个数分别单独取出并分别赋值给a,b,c。

在JS之中我们不必如此繁琐,我们可以使用JS的解构来将此过程简化为:

const arr = [2,3,4];
const [a,b,c] = arr;

此时,变量a=2,变量 b=3,变量c=4。在使用解构之后原始数组不会受到影响,此时arr仍为[2,3,4]。

再看以下情况:

const menu = ['鱼香肉丝','宫保鸡丁','泡椒风爪','麻辣兔头'];
const [first,second] = menu;

此时first与second变量的值应该是什么呢?显而易见他们是'鱼香肉丝'和'宫保鸡丁',但是如果我们不想吃宫保鸡丁但是想吃泡椒凤爪呢?JS当然支持我们这样做,我们可以:

const [first, ,second] = menu;

此时,first对应的值为'鱼香肉丝',second对应的值为'泡椒凤爪',在first与second之间的部分我们称之为hole,如果不想吃'泡椒凤爪'我们可以使用两个hole来将'泡椒凤爪'也跳过即:

const [first, , ,second] = menu;

此时second对应的值为'麻辣兔头' 。

我们还可以使用数组解构来实现交换值:

const temp = first;
first = second;
second = temp;

这是不使用数组解构时候的交换过程。

但是再JS之中我们可以:

[first, second] = [second, first]; 

通过数组解构我们甚至不用中间变量tmp。 

但是当我们有一个嵌套数组的时候呢?例如:

const nested = [1, 2, [5 ,6]];

这当然也可以使用解构,读者可以自行思考一下如何使用以下是使用解构来解构嵌套数组

const [i, ,[j,k]];

此时i=1 j=5 而k=6。 

在开发过程中,我们也很有可能不知道数组的长度,在此时我们有改如何使用解构呢,JS允许我们设置默认值

const arrDefault = [8, 9]
const [p,q,r] = arrDefault

此时r是undefined因为arrDefault数组之中并没有第三个元素,我们可以:

const [p = 1, q = 1, r = 1] = arrDefault;

当此时r的值为1,是我们设置的默认值。

2)Object Distructuring(对象解构)

首先我们创建一个对象基于此对象来具体解释对象的解构, 创建对象如下:

const restaurant = {
  name: 'Classico Italiano',
  location: 'Via Angelo Tavanti 23, Firenze, Italy',
  categories: ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'],
  starterMenu: ['Focaccia', 'Bruschetta', 'Garlic Bread', 'Caprese Salad'],
  mainMenu: ['Pizza', 'Pasta', 'Risotto'],

  openingHours: {
    thu: {
      open: 12,
      close: 22,
    },
    fri: {
      open: 11,
      close: 23,
    },
    sat: {
      open: 0, // Open 24 hours
      close: 24,
    },
  },
};

在进行数组解构时候我们使用[ ]”来进行解构,但是在进行对象解构的时候我们使用“{ }”来进行,因为我们也使用此符号来创建对象。

先来看一个对象解构的例子:

const {name, openingHours, categories} = restaurant;

首先,再进对象解构的过程之中,我们必须使用此类之中的属性名来进行解构,且没有顺序。此行代码创建了三个新的变量来对应restaurant之中的相应属性。其中name的值与restaurant 之中的name相同,剩余两个变量也与restaurant之中的同名属性的值相同。

如果我们想让新建的变量的名称不同我们也可以:

const {name: restaurantName, openingHours: hours, categories: tags} = restaurant;

此时restaurant之中的属性被解构出来分别赋予了变量 restaurantName,hours,tags。

我们当然也可以在数组解构之中设置默认值:

const {menu = [], starterMenu: starters = []} = restaurant;

resturant之中并不存在menu属性,但是由于我们设置了默认值,所以menu的值此时为[ ]。

再来看一个例子:

let a = 1;
let b = 2;
const obj = {a: 10, b: 7, c: 14};
//当我们想让变量a,b的值变成数组里面a,b对应的值时
({a, b} = obj);

读者可能会问,为什么要加小括号呢,这是因为在JS之中如果一开始使用花括号则是一个代码块,而代码块不允许进行赋值操作,使用小括号可以避免此类错误。

有嵌套数组,当然也有嵌套对象,那么我们如何对嵌套对象进行解构呢?

我们在上面的过程之中已将restaurant之中的openingHours属性进行了解构,在restaurant之中此属性为一个对象所以我们可以:

const { fri } = openingHours;

读者仔细观察会发现,fri也是一个对象,当我们想要获得fri对象之中open和close时候我们就需要使用嵌套解构:

const { fri: {open, close} } = openingHours;

此时我们将fri之中的open属性的值赋值给了open变量,将close属性的值赋值给了close变量。

这就是JS之中的解构。

                                                                                                                                            本文结束

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值