Функция стрелки ECMAScript 6, которая возвращает объект

620

При возврате объекта из функции стрелки кажется, что необходимо использовать дополнительный набор {}и returnключевое слово из-за неоднозначности в грамматике.

Это означает, что я не могу писать p => {foo: "bar"}, но должен писать p => { return {foo: "bar"}; }.

Если функция стрелки возвращает ничего, кроме объекта, {}и returnне нужно, например: p => "foo".

p => {foo: "bar"}возвращается undefined.

Модифицированные p => {"foo": "bar"}броски « SyntaxError: неожиданный токен: :» .

Есть что-то очевидное, чего мне не хватает?

jkschneider
источник

Ответы:

1108

Вы должны обернуть возвращаемый литерал объекта в скобки. В противном случае будут считаться фигурные скобки для обозначения тела функции. Следующие работы:

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

Вам не нужно заключать любое другое выражение в скобки:

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

и так далее.

Ссылка: MDN - Возвращение литералов объекта

alexpods
источник
7
Мне любопытно, почему парни имеют значение.
wrschneider
40
@wrschneider, потому что без парней js parser считает, что это тело функции, а не объект, а foo это метка
alexpods
21
Более конкретно, @wrschneider, в терминах узлов AST, использование скобок означает оператор выражения, в котором может существовать объектное выражение, тогда как по умолчанию фигурные скобки интерпретируются как оператор блока.
Патрик Робертс
5
Понятия не имею , почему это работает, но если вы хотите использовать значение в pкачестве ключа для объекта литерала, это то , как вы это делаете: p => ({ [p]: 'bar' }). Без [], это будет undefinedили буквально письмо p.
DanMan
1
@DanMan Это называется вычисленными свойствами, и это особенность литералов объекта.
Д. Пардал
62

Вы можете спросить, почему синтаксис действителен (но не работает должным образом):

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

Это из-за синтаксиса меток JavaScript :

Поэтому, если вы перенесете приведенный выше код в ES5, он должен выглядеть следующим образом:

var func = function (p) {
  foo:
  "bar"; //obviously no return here!
}
Петр Одут
источник
5
Этикетки - такая редко используемая и эзотерическая особенность. Они действительно имеют какое-либо значение? Я чувствую, что они должны быть устаревшими и в конечном итоге удалены.
Кенмор
@Kenmore См stackoverflow.com/questions/55934490/... - обратная совместимость. Браузеры откажутся от реализации функции, которая нарушает работу существующих сайтов
CertainPerformance
@ К тому же вы можете выйти из вложенных циклов, если они помечены. Не часто используется, но определенно полезно.
Петр Одут
17

Если тело функции стрелки заключено в фигурные скобки, оно не возвращается неявно. Оберните объект в скобках. Это будет выглядеть примерно так.

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

Обернув тело пареном, функция вернется { foo: 'bar }.

Надеюсь, это решит вашу проблему. Если нет, то я недавно написал статью о функциях Arrow, которая более подробно описывает это. Я надеюсь, что вы найдете это полезным. Javascript 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

xgqfrms
источник
1

Выпуск:

Когда вы делаете:

p => {foo: "bar"}

Интерпретатор JavaScript считает, что вы открываете блок кода с несколькими утверждениями, и в этом блоке вы должны явно указать оператор возврата.

Решение:

Если ваше выражение функции стрелки имеет один оператор , то вы можете использовать следующий синтаксис:

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

Но если вы хотите иметь несколько операторов, вы можете использовать следующий синтаксис:

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

В приведенном выше примере первый набор фигурных скобок открывает блок кода из нескольких операторов, а второй набор фигурных скобок предназначен для динамических объектов. В блоке кода с несколькими операторами функции стрелки, вы должны явно использовать операторы возврата

Для получения более подробной информации, смотрите Документацию Mozilla для выражений функций JS Arrow.

ржавый
источник
-2

Вы всегда можете проверить это для более индивидуальных решений:

x => ({}[x.name] = x);
SirtusKottus
источник