解除JavaScript解构语法的混淆

发布于:2021-02-08 10:00:54

0

115

0

JavaScript 语法 混淆

JavaScript是一种非常有用的语言。它允许您从一个对象中提取值,并在一条语句中将它们分配给一个新变量。如果你以前没有遇到过解构,一个相当基本的情况是这样的:

const person = {
 name: 'Mike Bifulco',
 height: 556,
 fears: ['heights', 'fire'],
};
const { name } = person;
console.log(name); // this will print 'Mike Bifulco'

这里发生的事情很简单。我们将创建一个名为name的const,并使用person.name中找到的值填充它。这是通过使用=左边的括号结构完成的。

(如果你以前没有见过或使用过这个,它肯定会让你感到困惑。不要为此责怪自己——这很快就会成为你的第二天性。)

通过解构还可以做很多其他有用的事情。对我来说,其中最常见的是:

重命名

如果你想从对象中取出一个值,但也需要重命名它(可能是为了代码的可读性),你可以在一行中完成:

const person = {
 name: 'Mike Bifulco',
 height: 556,
 fears: ['heights', 'fire'],
};


const { height: currentHeight } = person;

console.log(currentHeight); // 556
console.log(height); // undefined!

就像这样,我们已经将其分配person.height给currentHeight了一行。甜!

提取中

您可以从对象中提取一个值,然后使用其他所有内容创建另一个变量,也可以这样做:

const person = {
 name: 'Mike Bifulco',
 height: 556,
 fears: ['heights', 'fire'],
};

const { fears, ...fearlessPerson } = person;

console.log(fearlessPerson.fears); // undefined!
console.log(fears[0]); // heights

这是解构语法和散布运算符(...)的组合。非常便利!

困难模式:复杂的解构

因此,通过解构来提取和重命名事物都是相当简单的。我已经舒适地使用了这两个技巧一段时间了。在过去的几个月中,我一直在为一些不同的项目(包括我自己的网站)使用GatsbyJS,当我开始自定义和实现自己的Gatsby主题时,我开始看到一些看起来非常复杂的解构语法,从整个站点的GraphQL查询中提取嵌套值。 我真的被抛出了-乍一看,发生的情况并不明显。让我们看一个示例,该示例是从用于在Gatsby主题中呈现单个页面的React组件中提取的:

const singlePage = ({
 data,
 location,
 pageContext: { nextPagePath, previousPagePath },
}) => {
 return (
   <p>...react component markup</p>
 );
};

在singlePageReact组件的定义中发生了很多事情。让我们看一下这种分解,并简化一下:

const {
 data,
 location,
 pageContext: {
   nextPagePath,
   previousPagePath,
 },
} = props;

花了一些时间,并花了一些力气才能弄清楚这里正在完成什么,所以让我们逐步进行一下:

  1. 右边const是= props,它告诉我们所有这些值都从名为的对象中被破坏了props。

  2. 前两个值,data并且location是很有意义的-它们看起来就像上面的例子。该行将从对象中const的这两个路径中的每一个创建一个props。

  3. pageContext是事情变得有趣的地方-这是另一种破坏。令人困惑的是,这里从props中提取的值是nextPagePath和previousPagePath。没有为创建变量pageContext。

如果这种描述没有帮助-我不会怪你。我确实需要一些练习才能了解发生了什么。我什至不确定我会推荐使用这种语法-并不是特别容易阅读,特别是当诸如漂亮的工具将其压缩到更少的行上时。

话虽如此,这似乎是从Gatsby(可能还有其他地方)的GraphQL查询中提取数据时的必经之路。如果您要在那个世界上工作,那么熟悉一下这里发生的事情是个好主意。

我认为,习惯这种语法的最佳方法就是自己动手玩。我创建了一个JSBin,您可以使用它进行一些实验。我很想听听你如何处理它!检查它在这里。

您面临的一些挑战:

将变量重命名displayName为currentUserName

提取editedBy到自己的变量中

创建一个名为的对象meta,其中包含除方向以外的所有内容contactNumber。

总结

我很想听听您对此的看法-我发现自己写这篇文章是出于自助。通常,直到我孤立地练习一段时间后,这些事情才会具体化。您对销毁有什么创意用途?我在这里做错什么了吗?让我们来谈谈它。