Hint
Evaluated at call time, only when arg is undefined — can reference earlier params and outer scope
// Basic default parameters
function greet(name = 'World', greeting = 'Hello') {
return `${greeting}, ${name}!`;
}
greet(); // 'Hello, World!'
greet('Alice'); // 'Hello, Alice!'
greet('Bob', 'Hi'); // 'Hi, Bob!'
greet(undefined, 'Hey'); // 'Hey, World!' — undefined triggers default
greet(null, 'Hey'); // 'Hey, null!' — null does NOT trigger default
// Defaults can reference earlier parameters
function range(start = 0, end = start + 10) {
return { start, end };
}
range(); // { start: 0, end: 10 }
range(5); // { start: 5, end: 15 }
// Defaults can be expressions / function calls
let count = 0;
function makeId(id = ++count) { return id; } // evaluated each call
makeId(); // 1
makeId(); // 2
makeId(99); // 99 (provided, so default not evaluated)
// Defaults + destructuring (very common pattern)
function createUser({ name = 'Anonymous', role = 'user', active = true } = {}) {
return { name, role, active };
}
createUser({ name: 'Alice' }); // { name:'Alice', role:'user', active:true }
createUser(); // {} → uses = {} → all defaults apply