ECMAScript 6返回对象的箭头函数

jks*_*der 581 javascript ecmascript-6 arrow-functions

当从箭头函数返回一个对象时,由于语法的模糊性,似乎有必要使用额外的一组{}和一个return关键字.

这意味着我不能写p => {foo: "bar"},但必须写p => { return {foo: "bar"}; }.

如果箭头函数返回除对象以外的任何内容{},return则不需要,例如:p => "foo".

p => {foo: "bar"}回报undefined.

修改后的p => {"foo": "bar"}抛出" SyntaxError:意外标记:' :'".

有什么明显的东西我不见了吗?

ale*_*ods 1037

您必须将返回的对象文字包装到括号中.否则花括号将被视为表示函数的主体.以下作品:

p => ({ foo: 'bar' });
Run Code Online (Sandbox Code Playgroud)

您不需要将任何其他表达式包装到括号中:

p => 10;
p => 'foo';
p => true;
p => [1,2,3];
p => null;
p => /^foo$/;
Run Code Online (Sandbox Code Playgroud)

等等.

参考:MDN - 返回对象文字

  • @wrschneider因为没有parens js解析器认为它是一个函数体,而不是一个对象,而foo是[一个标签](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/标签) (39认同)
  • @wrschneider更具体地说,就AST节点而言,使用括号表示表达式语句,其中可以存在对象表达式,而默认情况下,花括号被解释为块语句. (20认同)
  • 我好奇*为什么*parens有所作为. (7认同)
  • @vikramvi 因为 `p => ({ foo: 'bar' })` 与 `p => { return { foo: 'bar' }) 相同;}`。这是一个简写语法。 (4认同)
  • 不知道为什么会这样,但如果你想使用`p`的值作为对象文字的关键,你就是这样做的:`p =>({[p]:'bar'})`.没有`[]`,它将是'undefined`或字母'p`. (3认同)
  • @DanMan它被称为[计算属性](https://developer.mozilla.org/pt-PT/docs/Web/JavaScript/Reference/Operators/Object_initializer#Compulated_property_names),它是对象文字的一个功能。 (3认同)

Pet*_*dut 58

您可能想知道,为什么语法有效(但没有按预期工作):

var func = p => { foo: "bar" }
Run Code Online (Sandbox Code Playgroud)

这是因为JavaScript的标签语法:

因此,如果您将上述代码转换为ES5,它应该如下所示:

var func = function (p) {
  foo:
  "bar"; //obviously no return here!
}
Run Code Online (Sandbox Code Playgroud)

  • 标签是很少使用且神秘的功能。他们真的有任何价值吗?我觉得应该弃用并最终将它们删除。 (4认同)
  • @Kenmore 见 /sf/ask/3915414331/#55934491 - 向后兼容。*浏览器将拒绝实施破坏现有网站的功能* (3认同)
  • @Kenmore 如果标记了嵌套循环,您可以退出它们。不经常使用但绝对有用。 (3认同)

Pau*_*ide 15

如果箭头函数的主体包裹在花括号中,则不会隐式返回它.将对象包裹在括号中.它看起来像这样.

p => ({ foo: 'bar' })
Run Code Online (Sandbox Code Playgroud)

通过将身体包裹在parens中,函数将返回{ foo: 'bar }.

希望,这可以解决您的问题.如果没有,我最近写了一篇关于箭头功能的文章,它更详细地介绍了它.希望对你有帮助.Javascript箭头功能


Rus*_*sty 5

问题:

当你在做:

p => {foo: "bar"}
Run Code Online (Sandbox Code Playgroud)

JavaScript 解释器认为您正在打开一个多语句代码块,并且在该块中,您必须明确提及一个 return 语句。

解决方案:

如果您的箭头函数表达式只有一个statement,那么您可以使用以下语法:

p => ({foo: "bar", attr2: "some value", "attr3": "syntax choices"})
Run Code Online (Sandbox Code Playgroud)

但是如果你想有多个语句,那么你可以使用以下语法:

p => {return {foo: "bar", attr2: "some value", "attr3": "syntax choices"}}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,第一组大括号打开一个多语句代码块,第二组大括号用于动态对象。在箭头函数的多语句代码块中,必须显式使用 return 语句

有关更多详细信息,请查看Mozilla Docs for JS Arrow Function Expressions