Для начала установите значение обратного вызова по умолчанию для себя или следующего ближайшего параметра до конца (первого) необязательного параметра,
Затем вы проверяете, установлены ли необязательные параметры как функции (обратный вызов) или не определены, и задаете для них значения по умолчанию или устанавливаете их сами.
function optional_params(color, size, weight, callback){
// set callback to itself or the next optional paramater until you have checked all optional paramaters
callback = callback || weight || size;
// check if weight is a function(the callback) or undefined and if so set to a default value, otherwise set weight as weight
weight = typeof weight != 'function' && typeof weight != 'undefined' ? weight : "1.2kg";
// do the same as above with weight
size = typeof size != 'function' && typeof size != 'undefined' ? size : "L";
// invoke callback
callback(color,size,weight);
}
И использование:
optional_params("Red",function(color,size,weight){
console.log("color: " + color); // color: Red
console.log("size: " + size); // size: L //(default)
console.log("weight: " + weight); // weight: 1.2kg //(default)
});