Função de seta do ECMAScript 6 que retorna um objeto

619

Ao retornar um objeto de uma função de seta, parece que é necessário usar um conjunto extra de {}e uma returnpalavra - chave devido a uma ambiguidade na gramática.

Isso significa que não posso escrever p => {foo: "bar"}, mas tenho que escrever p => { return {foo: "bar"}; }.

Se a função da seta retorna algo diferente de um objeto, o {}e returnsão desnecessários, por exemplo: p => "foo".

p => {foo: "bar"}retorna undefined.

Um modificado p => {"foo": "bar"}lança SyntaxError: token inesperado: ' :'” .

Há algo óbvio que estou perdendo?

jkschneider
fonte

Respostas:

1108

Você deve agrupar o literal do objeto retornado entre parênteses. Caso contrário, os aparelhos encaracolados serão considerados para denotar o corpo da função. Os seguintes trabalhos:

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

Você não precisa colocar nenhuma outra expressão entre parênteses:

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

e assim por diante.

Referência: MDN - Retornando literais de objetos

alexpods
fonte
7
Estou curioso para saber por que os parênteses fazem a diferença.
wrschneider
40
@wrschneider porque sem parênteses js analisador pensa que é um corpo da função, não um objeto, e foo é uma etiqueta
alexpods
21
@wrschneider, mais especificamente, em termos de nós AST, usar parênteses indica uma declaração de expressão, na qual uma expressão de objeto pode existir, enquanto, por padrão, chaves entre parênteses são interpretadas como uma declaração de bloco.
Patrick Roberts
5
Não faço ideia por que isso funciona, mas se você quiser usar o valor pcomo a chave para o objeto literal, este é como fazê-lo: p => ({ [p]: 'bar' }). Sem o [], será undefinedou literalmente a letra p.
DanMan
1
@DanMan Chama-se propriedades computadas e é um recurso de literais de objetos.
D. Pardal
62

Você pode se perguntar por que a sintaxe é válida (mas não está funcionando como o esperado):

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

É por causa da sintaxe do rótulo do JavaScript :

Portanto, se você transpilar o código acima para o ES5, ele deverá se parecer com:

var func = function (p) {
  foo:
  "bar"; //obviously no return here!
}
Petr Odut
fonte
5
Os rótulos são um recurso tão esotérico e raramente usado. Eles realmente têm algum valor? Eu sinto que eles devem ser preteridos e eventualmente removidos.
Kenmore
@Kenmore Consulte stackoverflow.com/questions/55934490/… - compatibilidade com versões anteriores. Navegadores irá recusar-se a implementar um recurso que divide sites existentes
CertainPerformance
@ Kenmore, você pode sair de loops aninhados se eles estiverem rotulados. Não é usado com frequência, mas é definitivamente útil.
Petr Odut
17

Se o corpo da função de seta estiver entre chaves, ele não será retornado implicitamente. Coloque o objeto entre parênteses. Seria algo parecido com isto.

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

Ao envolver o corpo em parênteses, a função retornará { foo: 'bar }.

Felizmente, isso resolve seu problema. Caso contrário, recentemente escrevi um artigo sobre as funções do Arrow, que o aborda com mais detalhes. Espero que você ache útil. Funções de seta Javascript

Paul McBride
fonte
2

os caminhos certos

  1. objeto de retorno normal

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. (expressões js)

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

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

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

explicar

imagem

A mesma resposta pode ser encontrada aqui!

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

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

xgqfrms
fonte
1

Questão:

Quando você está fazendo:

p => {foo: "bar"}

O intérprete JavaScript pensa que você está abrindo um bloco de código com várias instruções e, nesse bloco, é necessário mencionar explicitamente uma declaração de retorno.

Solução:

Se sua expressão de função de seta tiver uma única instrução , você poderá usar a seguinte sintaxe:

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

Mas se você quiser ter várias instruções , poderá usar a seguinte sintaxe:

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

No exemplo acima, o primeiro conjunto de chaves abre um bloco de código com várias instruções e o segundo conjunto de chaves é para objetos dinâmicos. No bloco de código de múltiplas instruções da função de seta, você deve usar explicitamente instruções de retorno

Para mais detalhes, consulte Mozilla Docs para expressões de função JS Arrow

Oxidado
fonte
-2

Você sempre pode verificar isso para obter mais soluções personalizadas:

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