为什么这是有效的语法?
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: {}
Perform ? RequireObjectCoercible(value).
Return NormalCompletion(empty).
它所做的(在 RequireObjectCoercible 中)只是要求右侧不为空或未定义。
这只是对象解构的极限情况。
虽然允许它似乎毫无意义,但允许像这样的边缘情况对于自动生成代码很有用,因此生成器不必检查是否有零项并跳过生成代码。
在重构一些代码时,我无意中发现这是有效的语法(或者至少不会在 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:
{}
Perform ? RequireObjectCoercible(value).
Return NormalCompletion(empty).
它所做的(在 RequireObjectCoercible 中)只是要求右侧不为空或未定义。
这只是对象解构的极限情况。
虽然允许它似乎毫无意义,但允许像这样的边缘情况对于自动生成代码很有用,因此生成器不必检查是否有零项并跳过生成代码。