Принцип работы опциональных аргументов в функциях js?

Увидел в гугловских доках что-то типа такого

chrome.tabs.setZoom(
  tabId?: number,
  zoomFactor: number,
  callback?: function,
)

Я могу представить что-то такое с помощью if-ов и typeof, когда у нас каждый параметр имеет разный тип данных, но не очень понимаю, как в приведенном выше примере наша функция поймет, опустил я tabId или нет.


Ответы (1 шт):

Автор решения: Qwertiy

Например, так:

function f(id, zoom, callback) {
  if (typeof zoom === "function") {
    callback = zoom
    zoom = id
    id = -1
  } else if (typeof zoom === "undefined") {
    zoom = id
    id = -1
  }
  
  console.log(id, zoom, callback)
}

f(100)
f(42, 100)
f(100, () => {})
f(42, 100, () => {})

console.log("")

f("oops")
f(42, "oops")
f("oops", () => {})
f(42, "oops", () => {})
.as-console-wrapper.as-console-wrapper { max-height: 100vh; }

Кстати, можно даже упростить (хотя не факт, что стоит - вдруг кто-то строку засунет?):

function f(id, zoom, callback) {
  if (typeof zoom !== "number") {
    callback = zoom
    zoom = id
    id = -1
  }
  
  console.log(id, zoom, callback)
}

f(100)
f(42, 100)
f(100, () => {})
f(42, 100, () => {})

console.log("")

f("oops")
f(42, "oops")
f("oops", () => {})
f(42, "oops", () => {})
.as-console-wrapper.as-console-wrapper { max-height: 100vh; }

→ Ссылка