Функція стрілки ECMAScript 6, яка повертає об'єкт


619

Повертаючи об'єкт із функції стрілки, здається, що необхідно використовувати додатковий набір {}та returnключове слово через неоднозначність у граматиці.

Це означає, що я не можу писати p => {foo: "bar"}, але мушу писати p => { return {foo: "bar"}; }.

Якщо функція стрілки повертає нічого, крім об'єкта, {}і returnне потрібно, наприклад: p => "foo".

p => {foo: "bar"}повертає undefined.

Змінено 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

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

@Kenmore ви можете вийти з вкладених циклів, якщо вони позначені міткою. Не часто використовується, але безумовно корисно.
Петро Одут

17

Якщо тіло функції стрілки загорнуте у фігурні дужки, воно неявно не повертається. Оберніть об'єкт у дужки. Це виглядало б приблизно так.

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

Загорнувши тіло в парен, функція повернеться { foo: 'bar } .

Сподіваємось, це вирішить вашу проблему. Якщо ні, то я нещодавно написав статтю про функції стрілок, яка висвітлює її більш докладно. Сподіваюсь, вам це стане в нагоді Функції стрілки Javascript


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/isissue/220

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


1

Проблема:

Коли ви це робите:

p => {foo: "bar"}

Інтерпретатор JavaScript вважає, що ви відкриваєте блок коду з декількома операторами, і в цьому блоці ви повинні чітко згадати про повернення.

Рішення:

Якщо у вашому вираженні функції зі стрілкою є одне твердження , ви можете використовувати такий синтаксис:

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

Але якщо ви хочете мати кілька висловлювань, ви можете використовувати наступний синтаксис:

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

У наведеному вище прикладі перший набір фігурних дужок відкриває код коду з декількома заявами, а другий набір фігурних дужок - для динамічних об'єктів. У блоці коду з декількома операторами функції стрілки ви повинні явно використовувати оператори return

Для отримання більш детальної інформації перегляньте Mozilla Docs для виразів JS Arrow Functions


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.