Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как первый параметр в функции может быть опциональным? (https://javascript.ru/forum/misc/86509-kak-pervyjj-parametr-v-funkcii-mozhet-byt-opcionalnym.html)

safohubo 26.06.2025 02:19

Как первый параметр в функции может быть опциональным?
 
Наткнулся здесь:

https://developer.mozilla.org/en-US/...tabs/insertCSS

У функции два параметра, первый - опциональный int, второй - объект:
let inserting = browser.tabs.insertCSS(
  tabId,           // optional integer
  details          // object
)

Далее, приводится пример вызова где они передают только объект:
let insertingCSS = browser.tabs.insertCSS({ code: css });

Что здесь вообще происходит? Должно же быть как-то так:
insertCSS(undefined, { code: css })

В JS же нельзя первый параметр пропускать или нет?

ksa 26.06.2025 09:34

Цитата:

Сообщение от safohubo
В JS же нельзя первый параметр пропускать или нет?

Если ты второй параметр хочешь передать именно как второй - нужно что-то указать как первый. :yes:

ksa 26.06.2025 09:37

Цитата:

Сообщение от safohubo
Что здесь вообще происходит?

Нечто типа такого... ;)

test(1, {tmp: 20})
test({test: 'Ok'})

// 
function test(v, o) {
	if (typeof v === 'object') {
		o = v
		v = 100
	}
	console.log(v, o)
}

ksa 26.06.2025 09:41

Количество аргументов можно учитывать...

test(1, {tmp: 20})
test({test: 'Ok'})

// 
function test(...arg) {
	let v = 100
	let o = arg[0]
	if (arg.length > 1) {
		v = arg[0]
		o = arg[1]
	}
	console.log(v, o)
}

safohubo 26.06.2025 15:46

ksa,
понятно, спасибо! А это нормальная практика делать такие функции/апишки? Они же спокойно могли поменять аргументы местами, а так это вроде как вводит в заблуждение. Там конечно сказано, что параметр опциональный, но не увидев пример, я бы не понял, что его вообще можно опустить. Плюсом они усложнили логику функции на ровном месте. Не говоря о том что они вообще могли tabID запихнуть в объект details, там проблем с чередованием нет вообще.

ksa 26.06.2025 16:59

Цитата:

Сообщение от safohubo
А это нормальная практика делать такие функции/апишки?

Например для тех же jQuery, Node.js это нормальная практика. :yes:

Цитата:

Сообщение от safohubo
они усложнили логику функции на ровном месте

Возможно конкретный пример и неудачный... Но на более удачных примерах это выглядит вполне нормальным.
Усложнение функции делают для удобства ее использования "конечным" программистам.
Это как бы расширяет возможности при использовании функций или методов... :write:

safohubo 26.06.2025 17:42

ksa,
понятно, спасибо за помощь!

Alexandroppolus 27.06.2025 11:12

Цитата:

Сообщение от safohubo
В JS же нельзя первый параметр пропускать или нет?

можно, с небольшим костыликом

function func(tabId, details) {
    if (typeof tabId !== 'number') {
        details = tabId;
        tabId = undefined;
    }

    console.log('tabId, details:', tabId, details);
}


чтобы это обрисовать в тайпскрипте, надо будет сделать перегрузку функции:
function func(tabId: number, details: object): void;
function func(details: object): void;
function func(...a: [number, object] | [object]): void {
    const [tabId, details] = a.length === 1 ? [undefined, a[0]] : a;

    // tabId: number | undefined
    // details: object
    console.log('tabId, details:', tabId, details);
}


Часовой пояс GMT +3, время: 08:23.