オブジェクトを返すECMAScript 6アロー関数


619

アロー関数からオブジェクトを返す場合、文法が曖昧であるため、追加のセット{}returnキーワードを使用する必要があるようです。

つまり、私は書くことができませんp => {foo: "bar"}が、書かなければなりませんp => { return {foo: "bar"}; }

arrow関数がオブジェクト以外のものを返す場合、{}およびreturnは不要ですp => "foo"。例:。

p => {foo: "bar"}を返しますundefined

変更されたものp => {"foo": "bar"}SyntaxError:予期しないトークン: ' :'」をスローします

私が見逃している明らかなものはありますか?

回答:


1108

返されるオブジェクトリテラルを括弧で囲む必要があります。それ以外の場合、波括弧は関数の本体を表すと見なされます。次の作品:

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

他の式を括弧で囲む必要はありません。

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

等々。

リファレンス:MDN-オブジェクトリテラルを返す


7
なぜ括弧が違いを生むの、私は興味あります。
wrschneider 2017年

40
@wrschneiderは、括弧がないとjsパーサーはオブジェクトではなく関数本体と
見なし

21
@wrschneiderより具体的には、ASTノードの観点から、括弧を使用すると、オブジェクトステートメントが存在できる式ステートメントを示しますが、デフォルトでは、中括弧はブロックステートメントとして解釈されます。
Patrick Roberts

5
これが機能する理由pはわかりませんが、オブジェクトリテラルのキーとしてas の値を使用する場合は、次のようにしますp => ({ [p]: 'bar' })。がなければ[]、それはundefined文字か文字通りのどちらかになりますp
DanMan、2018年

1
@DanMan 計算プロパティと呼ばれ、オブジェクトリテラルの機能です。
D.パルダル

62

なぜ構文が有効であるのか疑問に思われるかもしれません(ただし、期待どおりに機能しません)。

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

これは、JavaScriptのラベル構文が原因です。

したがって、上記のコードをES5にトランスパイルすると、次のようになります。

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

5
ラベルはあまり使用されず、難解な機能です。彼らは本当に価値がありますか?私はそれらが非難され、最終的に削除されるべきだと感じています。
ケンモア2019

@Kenmore stackoverflow.com/questions/55934490/を参照してください… -後方互換性。ブラウザは、既存のサイトを破壊する機能の実装を拒否します
特定のパフォーマンス

@Kenmoreラベル付けされている場合、ネストされたループを終了できます。あまり使用されませんが、確実に役立ちます。
Petr Odut

17

arrow関数の本体が中括弧で囲まれている場合、暗黙的に返されません。オブジェクトを括弧で囲みます。こんな感じになります。

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

本体を括弧で囲むことにより、関数はを返し{ foo: 'bar }ます。

うまくいけば、それはあなたの問題を解決します。そうでなければ、私は最近それをより詳細にカバーするアロー関数についての記事を書きました。お役に立てれば幸いです。JavaScriptアロー関数


2

正しい方法

  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


1

問題:

あなたがしているとき:

p => {foo: "bar"}

JavaScriptインタープリターは、複数ステートメントのコードブロックを開いていると判断し、そのブロックでreturnステートメントを明示的に言及する必要があります。

解決:

あなたの場合は矢印の関数式があり、単一の文を、その後、次の構文を使用できます。

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

ただし、複数のステートメントが必要な場合は、次の構文を使用できます。

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

上記の例では、中括弧の最初のセットは複数ステートメントのコードブロックを開き、中括弧の2番目のセットは動的オブジェクト用です。アロー関数のマルチステートメントコードブロックでは、returnステートメントを明示的に使用する必要があります

詳細については、Mozilla DocsでJS Arrow関数式を確認してください。


-2

より多くのカスタムソリューションについては、これをいつでも確認できます。

x => ({}[x.name] = x);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.