ECMAScript 6: Стрелочная функция, возвращающая объект
Проблема с возвратом объекта из стрелочной функции
Когда я пытаюсь вернуть объект из стрелочной функции, возникает необходимость использовать дополнительные фигурные скобки и ключевое слово return
, что связано с неоднозначностью в синтаксисе JavaScript.
Это означает, что я не могу написать код в виде p => {foo: "bar"}
, и мне нужно использовать p => { return {foo: "bar"}; }
.
Если же стрелочная функция возвращает что-то кроме объекта, фигурные скобки и return
не нужны. Например, p => "foo"
работает без дополнительных символов.
Но p => {foo: "bar"}
возвращает undefined
. При этом измененная запись p => {"foo": "bar"}
выдает ошибку: “SyntaxError: unexpected token: ':'”.
Неужели я упускаю что-то очевидное?
1 ответ(ов)
ES6 Стрелочные функции возвращают объект
Правильные способы
- Обычная функция возвращает объект
const getUser = user => {
// выполняем какие-то действия
const { name, age } = user;
return { name, age };
};
const user = { name: "xgqfrms", age: 21 };
console.log(getUser(user));
// {name: "xgqfrms", age: 21}
- (JS-выражения)
const getUser = user => ({ name: user.name, age: user.age });
const user = { name: "xgqfrms", age: 21 };
console.log(getUser(user));
// {name: "xgqfrms", age: 21}
Объяснение
Если вы попытаетесь переписать это выражение функции в виде стрелочной функции, вы, возможно, захотите просто перевести его так же, как в предыдущем примере, вот так:
let square = n => {
square: n * n;
};
Когда вы вызовете square
, вы заметите, что функция не работает так, как ожидалось. Какой бы входной параметр вы ни передали, вы всегда получите undefined
в качестве значения возврата. Почему это происходит?
Проблема со стрелочной функцией заключается в том, что парсер не интерпретирует фигурные скобки как литерал объекта, а рассматривает их как блочное выражение. Внутри этого блочного выражения парсер видит метку с именем square
, которая принадлежит оператору выражения n * n
. Поскольку нет никакого оператора return
, возвращаемое значение всегда undefined
.
Если быть более точным, тело функции состоит из блочного выражения, которое содержит один оператор — помеченный оператор. Его тело является оператором выражения, содержащим бинарное выражение. Поскольку отсутствует оператор return
, возврат значения не происходит.
Ссылки
Может ли выражение (a == 1 && a == 2 && a == 3) когда-либо оцениться как истинное?
Как создать псевдоним для импортируемого значения по умолчанию в JavaScript?
Синтаксис асинхронной стрелочной функции
Как клонировать объект JavaScript, исключив один ключ?
Как создать диалог с кнопками "Ок" и "Отмена"