为什么这是有效的语法?

Why is this valid syntax?

在重构一些代码时,我无意中发现这是有效的语法(或者至少不会在 Firefox 中导致解析器错误):

const {} = somefunc();

somefunc returns 一个 object 和 curly 应该包含用于解构的变量名称,当时我还没有决定这些名称是什么所以我暂时离开了它们是空的。

编辑器没有高亮语法错误,出于好奇我测试了一下,惊讶的是 Firefox 竟然没有这个语法问题。

为什么这个语法有效?它真的做了一些奇怪的事情吗?

解构对象时,您选择了所需的属性:

const {a, c} = {'c': 1, 'b': 2, 'a': 3};

因此没有参数是可以接受的,但仍然没有用:

const {} = {};

是的,像这样的空解构非常好,只是没用。 Runtime Semantics: DestructuringAssignmentEvaluation

中对此进行了介绍

With parameter value.

ObjectAssignmentPattern: {}

  1. Perform ? RequireObjectCoercible(value).

  2. Return NormalCompletion(empty).

它所做的(在 RequireObjectCoercible 中)只是要求右侧不为空或未定义。

这只是对象解构的极限情况。

虽然允许它似乎毫无意义,但允许像这样的边缘情况对于自动生成代码很有用,因此生成器不必检查是否有零项并跳过生成代码。