轨道
/
JavaScript
JavaScript
/
练习
/
Elyse 的解构魔法
Elyse 的解构魔法

Elyse 的解构魔法

学习练习

简介

数组解构

JavaScript 的数组解构语法是一种简洁的方式,可以从数组中提取值并赋值给不同的变量。

在下面这个例子中,numberOfMoons数组中的每个值都被赋值给对应的行星:

const numberOfMoons = [0, 2, 14];
const [venus, mars, neptune] = numberOfMoons;

neptune;
// => 14

简而言之:

  • 这种语法可以为数组中_指定位置_的元素命名,也可以通过重新赋值来交换变量。
  • 解构语法可以用在函数参数中,也可以用于任何可迭代对象。
  • 让某个位置保持未命名(不写_任何_变量名)会静默忽略该位置。

对象解构

在 JavaScript 中,还有一种解构语法,可以从对象中提取属性并赋值给不同的变量。

在下面这个例子中,我们从对象weather中提取天气符号:

const weather = {
  sun: '☀️',
  sun_behind_small_cloud: '🌤️',
  sun_behind_cloud: '⛅',
  sun_behind_large_cloud: '🌥️',
  sun_behind_rain_cloud: '🌦️',
  cloud: '☁️',
  cloud_with_rain: '🌧️',
  cloud_with_snow: '🌨️',
  cloud_with_lightning: '🌩️',
  cloud_with_lightning_and_rain: '⛈️',
};

const { sun, cloud, cloud_with_lightning: thunder } = weather;

sun;
// => '☀️'

cloud;
// => '☁️'

thunder;
// => '🌩️'

简而言之:

  • 这种语法既可以提取属性,也可以提取属性并重命名。
  • 解构语法可以用在函数参数中。

说明

Elyse 是未来的魔术师,正在继续她的训练。 她有一副牌想要摆弄。

为了让事情简单些,她通常只用数字 2 到 10 的牌开始,不过有些戏法可能会用到额外的(人头)牌。

Note

洗牌有很多种方式,但为了维持魔术的假象,关键在于任何一种方法都不能使用,例如 Elyse 不使用splice、slice、shift、unshift、push、at。 数组访问器array[index]和对象访问器(object[key]和object.key)也绝不能使用。

想帮 Elyse 提升她的魔法等级吗?

Advanced

每个函数都可以使用形参和一个只有单个return expression的函数体来实现。

1. 取出第一张牌

Elyse 会召唤牌堆中的第一张牌,而不使用array[index]、.at(index)或.shift()。 就像变魔术一样。

const deck = [5, 9, 7, 1, 8];

getFirstCard(deck);
// => 5

2. 取出第二张牌

Elyse 施展手法,不使用array[index]或.shift(),就召唤出牌堆中的第二张牌。

const deck = [3, 2, 10, 6, 7];

getSecondCard(deck);
// => 2

3. 交换两张牌

Elyse 会让牌堆中的两张牌互换位置。 她不需要调用任何函数。

const deck = [10, 7];

swapTwoCards(deck);
// => [7, 10]

4. 轮换三张牌

为了再施展一些手法,Elyse 拿起三张牌,迅速把最上面的牌移到后面,让中间的牌成为第一张牌,原来的最下面的牌成为中间的牌。 她不需要调用任何函数。

const deck = [2, 6, 10];

shiftThreeCardsAround(deck);
// => [6, 10, 2]

5. 选出指定的一堆

Elyse 会把牌堆分成两堆。 接着她请观察者从两堆中挑出一堆,我们把它命名为chosen。 disregarded这一堆不再有用,她让它消失了。 她不需要调用任何函数。

const deck = [5, 4, 7, 10];
const chosen = [5, 4];
const disregarded = [7, 10];

pickNamedPile({ chosen, disregarded });
// => [5, 4]

5. 交换挑出的那一堆

不幸的是,观察者总是挑到“错误”的那一堆,但靠着一些巧妙迅速的手法,Elyse 把chosen这一堆改名为disregarded,把disregarded这一堆改名为chosen。 她不需要调用任何函数。

const deck = [5, 4, 7, 10];
const chosen = [5, 4];
const disregarded = [7, 10];

swapNamedPile({ chosen, disregarded });
// => { chosen: [7, 10], disregarded: [5, 4] }
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
JavaScript Exercism

准备好开始 Elyse 的解构魔法 了吗?

注册 Exercism,借助 37 个概念159 个练习 和真人导师指导,学习并掌握 JavaScript,全部免费。