面试题答案
一键面试默认参数常见使用场景
- 简化函数调用:当函数某些参数在多数情况下使用相同的值时,通过设置默认参数,调用者在调用函数时可省略这些参数。例如:
function greet(name = 'Guest') {
console.log(`Hello, ${name}!`);
}
greet(); // 输出 Hello, Guest!
greet('John'); // 输出 Hello, John!
- 向后兼容:在更新函数接口时,添加新参数并设置默认值,原有调用代码无需修改。如:
// 旧函数
function calculate(a, b) {
return a + b;
}
// 新函数,添加了一个新参数c并设置默认值
function calculate(a, b, c = 0) {
return a + b + c;
}
// 旧调用代码仍可正常工作
calculate(1, 2);
// 新调用可使用新参数
calculate(1, 2, 3);
- 提供合理的默认配置:对于一些需要配置参数的函数,提供默认配置,让调用者可按需覆盖。比如:
function ajax(url, options = { method: 'GET', headers: {} }) {
// 执行AJAX请求逻辑
}
ajax('/api/data'); // 使用默认配置
ajax('/api/data', { method: 'POST', headers: { 'Content-Type': 'application/json' } }); // 覆盖默认配置
类型相关注意事项
- 默认参数的类型推断:默认参数的类型会影响函数参数的类型推断。若默认参数类型不明确,TypeScript可能无法正确推断。例如:
// 这里TypeScript会推断x为number类型
function add(x = 1, y: number) {
return x + y;
}
// 如果默认参数类型模糊,会导致错误
function add(x = '1', y: number) { // 报错,'1' 类型不能赋值给 'number' 类型
return x + y;
}
- 与剩余参数的结合使用:当函数既有默认参数又有剩余参数时,要注意参数顺序和类型匹配。剩余参数必须在默认参数之后,且类型需正确定义。例如:
function log(message: string, ...values: any[] = []) {
console.log(message, ...values);
}
log('Hello');
log('Numbers:', 1, 2, 3);
- 函数重载与默认参数:在使用函数重载时,默认参数的类型要与重载定义匹配。如果不匹配,会导致运行时错误或类型检查错误。例如:
function printValue(value: string): void;
function printValue(value: number): void;
function printValue(value: any, prefix = 'Value: '): void {
console.log(prefix + value);
}
printValue('Hello');
printValue(123);
这里默认参数 prefix
的类型要保证在所有重载情况下都合理,否则会出现类型不匹配问题。