分页组件里每页条数默认十条,调用时传了 0,想表示不分页,结果还是返回十条。这不是 bug,是默认参数只认 undefined。
只有 undefined 会触发
function fetchList(page, size = 10) 里,传 null、0、空字符串、false 都不会用默认值,它们都是有效实参。想让空值兜底,得写 size ?? 10,或者在函数体里自己判断。很多从别的语言转过来的人习惯用 or 的思路,第一个月基本都要踩一次。
默认值可以引用前面的参数
function rect(w, h = w) 传一个参数时得到正方形,这是合法写法,求值顺序从左到右。默认值也可以是函数调用,但每次调用都会重新算,写成 new Date() 拿到的是当前时间。对象字面量每次都是新对象,不会像 Python 那样共享同一个可变默认值,这一点省心。
function createCard(title, opts = {}) { const { width = 320 } = opts; }解构加默认值是常见组合,宽度不传就是 320。注意整个 opts 不传才用 {},传了 null 会在解构时抛错,接口返回的数据要先兜一层。
想跳过前面的参数
只能显式传 undefined 占位,比如 fetchList(undefined, 20)。这种写法可读性很差,参数一多就该改成对象入参:fetchList({ size: 20 }),配合解构默认值,谁看都明白,加参数也不用改调用处。
和 length、arguments 的关系
声明默认值之后,fn.length 只数第一个默认参数之前的形参,上面 createCard.length 是 1。靠 length 做参数校验的库会算错。arguments 仍然反映实参,箭头函数没有它,用默认参数时别混着依赖。
默认值不是类型检查
传字符串进来照样跑,默认值只补缺不校验类型。真要约束,用 TypeScript 或者运行时判断。它只解决「没传」这一种情况,别指望它兜住脏数据。