Почему не происходит перезаписи значений параметров ф-ции?

Не понимаю почему не происходит перезапись значения аргумента ф-ции на undefined? Я всегда думал, что параметры - это своего рода переменные, только локальные:

//пример с функцией
function func(a, b = 10) {
  console.log(a, b);
};
func('word', undefined); //'word' 10 --> перезаписи на undefined не происходит 

//пример с переменной
let a = 5;
a = undefined;
console.log(a); //undefined --> перезапись происходит

Почему так работает? Значение по умолчанию у аргумента имеет приоритет?


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

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

Значение по умолчанию - это подстановка значения вместо undefined в момент вызова, а не фоллбэк для переменной.

function func(a, b = 10) {
  console.log(a, b);
  b = undefined;
  console.log(a, b);
  ++b;
  console.log(a, b);
}

func('word', undefined);

Работает примерно так:

function func(a, b) {
  if (b === undefined) b = 10;

  console.log(a, b);
  b = undefined;
  console.log(a, b);
  ++b;
  console.log(a, b);
}

func('word', undefined);

А вовсе не так:

function func(a, b) {
  with ({
    __proto__: null,
    get b() { return b === undefined ? 10 : b },
    set b(x) { b = x },
  }) {
    console.log(a, b);
    b = undefined;
    console.log(a, b);
    ++b;
    console.log(a, b);
  }
}

func('word', undefined);

→ Ссылка
Автор решения: HTO HOT

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

Пример:

function foo(a){
   console.log(a)
}
foo()
/// вывод в логах undefined

Вы предположили, что если в переменную передать undefined то оно перезапишется, но это не так и сработало это только из-за метода console.log.

Пример где не перезаписывается если передать переменную:

const foo = (a,b=40)=>{
  console.log(a,b)
}
let c = undefined
foo('word',c)

Тут возникает вопрос, а возможно ли определять передал ли программист осознанно undefined или же его сам подставил механизм языка. И да это возможно реализовать с помощью arguments или же Spread syntax.

function foo(a,...args){
  let b
  if(args.length===0){
    b=20 //// допустим что 20 это число по умолчанию
  }else{
    b=args[0]
  }
  console.log(a,b)
}
foo('123')
foo('123',undefined)
foo('123',1,2,3)

→ Ссылка