Что делают квадратные скобки после функции ES6?

Недавно я искал способ переписать уродливый оператор switch/case и наткнулся на эта статья на Медиуме.

Я переписал свой переключатель/кейс в функцию es6 следующим образом:

const url = category => ({
          'itemA': itemAService.getItemCategories(payload),
          'itemB': itemBService.getItemCategories(payload),
        })[category]

Когда я вызываю эту функцию с чем-то вроде const response = url(category);, она работает, и это здорово! Но потом мне стало интересно, что именно означает [category] в конце функции. Я подумал, может быть, это функция с немедленным вызовом, но это тоже не показалось правильным.

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

Так что же он делает?

То же, что object[property]. Подробнее здесь: МДН.

VisioN 12.06.2019 17:30

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

Sterling Archer 12.06.2019 17:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
701
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это не "после" функции, это в тело функции. Это также может быть записано как:

  const url  = category => {
    const obj = {
      'itemA': itemAService.getItemCategories(payload),
      'itemB': itemBService.getItemCategories(payload),
    };

    return obj[category];
 };

Так что это в основном просто поиск динамических свойств в объекте.

Ах, хорошо, это имеет смысл. Думаю, меня просто сбили с толку квадратные скобки, потому что я так привык видеть функции IIFE. Спасибо за ответ!

J. Jackson 12.06.2019 17:37

Сокращенные обозначения JavaScript, безусловно, созрели для создания запутанного синтаксиса. Вы должны внимательно посмотреть, чтобы сказать, что это не какой-то IIFE.

Barmar 12.06.2019 17:40

@Barmar: Просмотр AST может помочь, если кому-то это удобно. Бессовестная вилка: astexplorer.net .

Felix Kling 12.06.2019 23:56

Это сокращение примерно эквивалентно следующему традиционному синтаксису функций:

function url(category) {
    var obj = {
      'itemA': itemAService.getItemCategories(payload),
      'itemB': itemBService.getItemCategories(payload),
    };
    return obj[category];
}

Легче увидеть, что происходит, когда вы создаете именованную переменную для объекта.

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

Они могли бы поставить [category] сразу после литерала объекта, а не после закрывающей скобки, это было бы понятнее.

Что вас здесь смущает, так это брекеты.

Представьте, что у вас есть выражение объекта, и вы используете оценщик свойств для переменной, которая указывает на объект.

obj = {foo: 1, bar: 2}
return obj["foo"];    //returns 1

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

return {foo: 1, bar: 2}["foo"];    // WRONG Syntax
return ({foo: 1, bar: 2})["foo"];  // CORRECT syntax 

Итак, ваша функция может быть переписана с использованием следующего традиционного синтаксиса.

function getUrl(category) {

   return ({
          'itemA': itemAService.getItemCategories(payload),
          'itemB': itemBService.getItemCategories(payload),
        })[category]

}

Другие вопросы по теме