{ 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......" />
当从箭头函数返回一个对象时,由于语法上的歧义,似乎有必要使用一组额外的 {}
和一个 return
关键字。
这意味着我不能写 p => {foo: "bar"}
,但必须写 p => { return {foo: "bar"}; }
。
如果箭头函数返回的不是对象,则 {}
和 return
是不必要的,例如:p => "foo"
。
p => {foo: "bar"}
返回 undefined
。
修改后的 p => {"foo": "bar"}
抛出 “SyntaxError
:意外令牌:':
'”。
我有什么明显的遗漏吗?
您必须将返回的对象文字包装到括号中。否则,花括号将被视为表示函数的主体。以下作品:
p => ({ foo: 'bar' });
您不需要将任何其他表达式包装到括号中:
p => 10;
p => 'foo';
p => true;
p => [1,2,3];
p => null;
p => /^foo$/;
等等。
参考:MDN - Returning object literals
您可能想知道,为什么语法是有效的(但没有按预期工作):
var func = p => { foo: "bar" }
这是因为 JavaScript's label syntax:
所以如果你把上面的代码转换成 ES5,它应该是这样的:
var func = function (p) {
foo:
"bar"; //obviously no return here!
}
如果箭头函数的主体用花括号括起来,则不会隐式返回。将对象包裹在括号中。它看起来像这样。
p => ({ foo: 'bar' })
通过将主体包裹在括号中,该函数将返回 { foo: 'bar }
。
希望这可以解决您的问题。如果没有,我最近写了一篇关于箭头函数的文章,其中更详细地介绍了它。希望对你有帮助。 Javascript Arrow Functions
p => ({ foo: 'bar' })
被转译成 p => { return { foo: 'bar' }; }
。这是一种速记语法。
p => p * 2
将返回 p * 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
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
您可以随时查看更多自定义解决方案:
x => ({}[x.name] = x);
p
的值作为对象字面量的键,你可以这样做:p => ({ [p]: 'bar' })
。如果没有[]
,它将是undefined
或字面意义上的字母p
。