{ return {foo: "bar"}; }。如果箭头函数返回的不是对象,则 {} 和 return 是不必要的,例如:p => "foo"。p => {foo: "bar"} 返回 undefined......" /> { return {foo: "bar"}; }。如果箭头函数返回的不是对象,则 {} 和 return 是不必要的,例如:p => "foo"。p => {foo: "bar"} 返回 undefined......"> { return {foo: "bar"}; }。如果箭头函数返回的不是对象,则 {} 和 return 是不必要的,例如:p => "foo"。p => {foo: "bar"} 返回 undefined......" />
ChatGPT解决这个技术问题 Extra ChatGPT

返回对象的 ECMAScript 6 箭头函数

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

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

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

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

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

我有什么明显的遗漏吗?

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

s
str

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

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 ,它是对象文字的一个特征。
P
Petr Odut

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

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 如果它们被标记,您可以退出嵌套循环。不经常使用但绝对有用。
P
Paul McBride

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

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

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

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


为什么我们不必在括号内使用 return 关键字?
因为 p => ({ foo: 'bar' }) 被转译成 p => { return { foo: 'bar' }; }。这是一种速记语法。
箭头函数隐式返回箭头右侧的表达式。例如 p => p * 2 将返回 p * 2 的结果。这条规则的例外是当右边的表达式用大括号括起来时,你必须自己返回。
R
Rusty

问题:

当你这样做时:

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


x
xgqfrms

ES6 箭头函数返回一个对象

正确的方法

普通函数返回一个对象


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

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

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

(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://user-images.githubusercontent.com/7291672/63484861-ba0bf480-c4d3-11e9-950e-e22613ef25f6.png

参考

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

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


S
SirtusKottus

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

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

这甚至不会返回一个新对象。您在那里创建的对象将被丢弃。这与这个问题关系不大。