Почему не происходит перезаписи значений параметров ф-ции?
Не понимаю почему не происходит перезапись значения аргумента ф-ции на 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 шт):
Значение по умолчанию - это подстановка значения вместо 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);
Это происходит из-за того, что если вы вовсе не передадите параметр он по умолчанию будет как 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)