Аргументы функции, объект со значениями, равными пустому объекту

В настоящее время я работаю над кодом разработчика MongoDB Javascript.

Что-то у меня в голове не укладывается:

У этого метода есть некоторые забавные дела, происходящие в аргументах здесь. Что означает {filters = null, page = 0, moviesPerPage = 20} = {}? Чего вы добиваетесь, приравнивая его к пустому объекту?

  static async getMovies({
    filters = null,
    page = 0,
    moviesPerPage = 20,
  } = {}) {
   /// more code
...}

Вот вся функция для большего контекста, если он вам понадобится:

  static async getMovies({
    filters = null,
    page = 0,
    moviesPerPage = 20,
  } = {}) {
    let queryParams = {}
    if (filters) {
      if ("text" in filters) {
        queryParams = this.textSearchQuery(filters["text"])
      } else if ("cast" in filters) {
        queryParams = this.castSearchQuery(filters["cast"])
      } else if ("genre" in filters) {
        queryParams = this.genreSearchQuery(filters["genre"])
      }
    }

    let { query = {}, project = {}, sort = DEFAULT_SORT } = queryParams
    let cursor
    try {
      cursor = await movies
        .find(query)
        .project(project)
        .sort(sort)
    } catch (e) {
      console.error(`Unable to issue find command, ${e}`)
      return { moviesList: [], totalNumMovies: 0 }
    }

    /**
    Ticket: Paging

    Before this method returns back to the API, use the "moviesPerPage" and
    "page" arguments to decide the movies to display.

    Paging can be implemented by using the skip() and limit() cursor methods.
    */

    // TODO Ticket: Paging
    // Use the cursor to only return the movies that belong on the current page
    const displayCursor = cursor.limit(moviesPerPage)

    try {
      const moviesList = await displayCursor.toArray()
      const totalNumMovies = page === 0 ? await movies.countDocuments(query) : 0

      return { moviesList, totalNumMovies }
    } catch (e) {
      console.error(
        `Unable to convert cursor to array or problem counting documents, ${e}`,
      )
      return { moviesList: [], totalNumMovies: 0 }
    }
  }
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
0
0
713
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Это параметр по умолчанию. Это предотвращает выдачу методом ошибки, если параметр не указан.

ссылка MDN

function getMovies({
  filters = null,
  page = 0,
  moviesPerPage = 20,
} = {}) {
  console.info('getMovies', filters, page, moviesPerPage)
}

function getMovies2({
  filters = null,
  page = 0,
  moviesPerPage = 20,
}) {
  console.info('getMovies2', filters, page, moviesPerPage)
}

getMovies({})
getMovies()
getMovies2({})
getMovies2()

Разве выдача ошибки не является хорошей вещью? Я думаю, это будет зависеть от общего дизайна приложения.

Riza Khan 21.12.2020 02:18

Да, это зависит. Вам пришлось бы вызывать его с пустым объектом самостоятельно, если бы вы хотели использовать свойства по умолчанию: getMovies({})

xehpuk 21.12.2020 02:22

Ниже есть строчка: let { query = {}, project = {}, sort = DEFAULT_SORT } = queryParams следует той же логике? Пусть этот объект будет пустым, если он не указан в queryParams

Riza Khan 21.12.2020 02:33

Да. Но это потенциально может привести к сбою, если queryParams будет undefined.

xehpuk 21.12.2020 10:11

Это параметр функции по умолчанию.

Если нет никакого параметра, {} будет значением по умолчанию для этого реквизита.

Это необходимо, потому что если какой-либо параметр не передан, значение становится undefined.

В этом случае возникает ошибка, когда вы пытаетесь получить такие значения, как filters и page, из реквизита undefined. так вроде бы использовали.

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