【问题标题】:ECMAScript 6 arrow function that returns an object返回对象的 ECMAScript 6 箭头函数
【发布时间】:2022-01-05 19:24:15
【问题描述】:

从箭头函数返回对象时,由于语法不明确,似乎有必要使用一组额外的{}return 关键字。

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

如果箭头函数返回的不是对象,{}return 是不必要的,例如:p => "foo"

p => {foo: "bar"} 返回undefined

修改后的p => {"foo": "bar"} 抛出SyntaxError:意外令牌:':'”

我有什么明显的遗漏吗?

【问题讨论】:

  • 我不清楚什么时候使用 return 关键字,什么时候不使用它,JS 非常灵活,为该语言的新用户带来了大量的错误。我希望它像“Java”语言一样严格

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:

ES6 箭头函数返回一个对象

正确的方法

  1. 普通函数返回一个对象

const getUser = user => {return { name: user.name, age: user.age };};

const user = { name: "xgqfrms", age: 21 };

console.log(getUser(user));
//  {name: "xgqfrms", age: 21}

  1. (js表达式)

const getUser = user => ({ name: user.name, age: user.age });

const user = { name: "xgqfrms", age: 21 };

console.log(getUser(user));
//  {name: "xgqfrms", age: 21}

解释

参考

https://github.com/lydiahallie/javascript-questions/issues/220

https://mariusschulz.com/blog/returning-object-literals-from-arrow-functions-in-javascript

【讨论】:

    【解决方案2】:

    问题:

    当你在做的时候:

    p => {foo: "bar"}
    

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

    解决办法:

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

    p => ({foo: "bar", attr2: "some value", "attr3": "syntax choices"})
    

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

    p => {return {foo: "bar", attr2: "some value", "attr3": "syntax choices"}}
    

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

    更多详情,请查看Mozilla Docs for JS Arrow Function Expressions

    【讨论】:

      【解决方案3】:

      您可以随时查看更多自定义解决方案:

      x => ({}[x.name] = x);
      

      【讨论】:

      • 这甚至不会返回一个新对象。您在那里创建的对象将被丢弃。这和这个问题关系不大。
      【解决方案4】:

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

      p => ({ foo: 'bar' });
      

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

      p => 10;
      p => 'foo';
      p => true;
      p => [1,2,3];
      p => null;
      p => /^foo$/;
      

      等等。

      参考:MDN - Returning object literals

      【讨论】:

      • 我很好奇为什么括号会有所作为。
      • @wrschneider 因为没有parens js解析器认为它是一个函数体,而不是一个对象,而 foo 是a label
      • @wrschneider 更具体地说,在 AST 节点方面,使用括号表示表达式语句,其中可以存在对象表达式,而默认情况下,花括号被解释为块语句。
      • 不知道为什么会这样,但是如果你想使用 p 的值作为对象字面量的键,你可以这样做:p => ({ [p]: 'bar' })。没有[],它要么是undefined,要么就是字母p
      • @DanMan 它叫做computed properties,它是对象字面量的一个特性。
      【解决方案5】:

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

      var func = p => { foo: "bar" }
      

      因为JavaScript's label syntax:

      所以如果你把上面的代码转换成 ES5,它应该是这样的:

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

      【讨论】:

      • 标签是一个很少使用和深奥的功能。它们真的有任何价值吗?我觉得它们应该被弃用并最终被删除。
      • @Kenmore 请参阅stackoverflow.com/questions/55934490/… - 向后兼容。 浏览器将拒绝实施破坏现有网站的功能
      • @Kenmore 如果嵌套循环被标记,您可以退出它们。不经常使用,但绝对有用。
      【解决方案6】:

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

      p => ({ foo: 'bar' })
      

      通过将主体包裹在括号中,函数将返回{ foo: 'bar }

      希望这能解决您的问题。如果没有,我最近写了一篇关于箭头函数的文章,其中更详细地介绍了它。希望对你有帮助。 Javascript Arrow Functions

      【讨论】:

      • 为什么我们不必在括号内使用 return 关键字?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多