es6默认参数核心是仅在参数为undefined时生效,不覆盖0、false、''等合法falsy值;支持解构赋值兜底、动态表达式及前置参数依赖,但null需用??等额外处理。

ES6 默认参数的核心是“只在 undefined 时生效”,不干扰 0、false、'' 等合法 falsy 值。合理设置能直接省掉大量 if (typeof x === 'undefined') 或 x || 'default' 这类易出错的兜底逻辑。
基础写法:形参后直接赋值
语法简洁,语义清晰:
function greet(name = '游客', age = 18) { ... }- 调用
greet()→name取'游客',age取18 - 调用
greet('小明', undefined)→name为'小明',age仍取默认18 - 调用
greet('小明', 0)→age就是0,不会被覆盖
对象参数兜底:两层默认值必须都写
处理配置对象最常见也最容易出错——缺了外层默认值会直接报错:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- ✅ 正确:
function request({ url = '/api', timeout = 5000 } = {}) { ... } - ❌ 错误:
function request({ url = '/api' }) { ... }—— 调用request()时参数是undefined,解构undefined报错 - 外层
= {}是安全兜底,确保解构目标始终是对象;内层各属性默认值独立生效 - 嵌套也支持:
{ data: { code = 0 } = {} } = config
动态默认值:支持表达式与函数调用
默认值不是静态快照,每次调用都重新计算,适合需要实时性或避免引用共享的场景:
-
function log(msg, time = new Date().toISOString()) { ... }—— 每次调用时间都不同 -
function createItem(id = generateId(), tags = []) { ... }——tags = []每次都是新数组,不会共用同一引用 - 可依赖前置参数:
function calc(x, y = x * 2) { return x + y; },但不能反向引用 - 避免副作用:
timeout = console.log('using default') || 3000不推荐,影响可读性和调试
替代方案:何时不用默认参数?
默认参数只响应 undefined,若需对 null 也兜底,或要做类型校验,就得换方式:
- 统一处理
null和undefined:const name = inputName ?? '匿名' - 强类型校验:
const title = typeof opts.title === 'string' ? opts.title : '默认标题' - 多参数联动规则(如范围校验):
function validate({ min, max } = {}) { return { min: Math.min(min ?? 0, max ?? 100), max: Math.max(min ?? 0, max ?? 100) }; }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










