객체를 반환하는 ECMAScript 6 화살표 함수


619

화살표 함수에서 객체를 반환 할 때는 문법의 모호성 때문에 추가 키워드 {}return키워드 를 사용해야 할 것 같습니다 .

그 말은 내가 쓸 수 없습니다 p => {foo: "bar"}만 작성해야합니다 p => { return {foo: "bar"}; }.

화살표 기능은 객체 이외의 아무것도 반환하는 경우 {}와는 return, 예를 들어 불필요한 있습니다 p => "foo".

p => {foo: "bar"}을 반환합니다 undefined.

수정 A는 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 2012 년

40
@wrschneider @ pars없이 js 파서는 그것의 객체가 아니라 함수 몸체라고 생각하고 foo는 레이블입니다
alexpods

21
보다 구체적으로, AST 노드와 관련하여 @wrschneider는 괄호를 사용하여 객체 표현식이 존재할 수있는 표현식 명령문을 나타내며, 기본적으로 중괄호는 블록 명령문으로 해석됩니다.
Patrick Roberts 17 년

5
왜 이것이 효과가 있는지 모르겠지만 p객체 리터럴의 키 값을 사용하려면 다음과 같이하십시오 p => ({ [p]: 'bar' }). 포함하지 않는 [], 그것은이 될 것 undefined그대로 문자 나 p.
DanMan

1
@DanMan 계산 된 속성 이라고 하며 객체 리터럴의 기능입니다.
D. Pardal

62

왜 구문이 유효한지 궁금하지만 예상대로 작동하지 않을 수 있습니다.

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

JavaScript의 레이블 구문 때문입니다 .

따라서 위 코드를 ES5로 변환하면 다음과 같아야합니다.

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

5
레이블은 드물게 사용되며 난해한 기능입니다. 그들은 정말로 가치가 있습니까? 나는 그들이 더 이상 사용되지 않아 결국 제거되어야한다고 생각합니다.
Kenmore

@Kenmore stackoverflow.com/questions/55934490/…- 이전 버전과의 호환성을 참조하십시오 . 브라우저는 기존 사이트를 손상시키는 기능 구현을 거부합니다.
CertainPerformance

@Kenmore 중첩 된 루프에서 레이블이 지정된 경우 종료 할 수 있습니다. 자주 사용되지는 않지만 확실히 유용합니다.
Petr Odut

17

화살표 함수의 본문이 중괄호로 싸여 있으면 암시 적으로 반환되지 않습니다. 개체를 괄호로 묶습니다. 이런 식으로 보일 것입니다.

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

본문을 괄호로 묶으면 함수가을 반환 { foo: 'bar }합니다.

바라건대, 그것은 당신의 문제를 해결합니다. 그렇지 않다면 최근에 Arrow 함수에 대해 자세히 다루는 기사를 썼습니다. 도움이 되셨기를 바랍니다. 자바 스크립트 화살표 함수


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"}}

위의 예에서 첫 번째 중괄호 세트는 다중 문 코드 블록을 열고 두 번째 중괄호 세트는 동적 객체를위한 것입니다. 다중 문 코드 화살표 함수에서는 return 문을 명시 적으로 사용해야합니다.

자세한 내용은 Mozilla Docs에서 JS Arrow Function Expressions를 확인하십시오.


-2

더 많은 맞춤형 솔루션을 위해 언제든지 이것을 확인할 수 있습니다.

x => ({}[x.name] = x);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.