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?

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


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

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


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


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


-2

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

x => ({}[x.name] = x);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.