← 返回目录

7. 参数与默认参数·会员折扣

投料不讲究就会翻车。今天解决三件事:料给多给少怎么办ES6 默认参数兜底,以及做机器的铁律「一台机器只干一件事」。最后用一个会员折扣计算器实战。

7.1 互动演示(参数不匹配 / 默认参数 / 会员折扣计算器)

先看参数三种不匹配,再用会员折扣计算器实战单一职责。

7.2 知识点逐条讲解(配合代码)

① 料的数量对不上,三种情况

情况结果
给的料 = 投料口正常,一个对一个
给的料 > 投料口多出来的直接扔掉
给的料 < 投料口缺的那个投料口 = undefined,算起来容易出 NaN
function add(a, b, c) {   // 三个投料口
    return a + b + c;      // 三个加起来
}
add(1, 2);       // 只给2个料 → c 是空 → 1+2+空 = NaN
add(1, 2, 3, 4); // 给4个料 → 多的那个扔掉,只用1+2+3=6

	

② ES6 默认参数:忘了给料就用默认值兜底

在投料口后面直接写 = 默认值,没给料时就自动用这个默认值,不会再出 undefined

// 投料口后面写 = 默认值,忘了给料就用它
function add(a = 0, b = 0, c = 0) {
    return a + b + c;      // 缺哪个就补0
}
add(1, 2);       // c 没给 → 用默认0 → 1+2+0=3

	

③ 单一职责原则:一台机器只干一件事

好处:好懂、好改、好单独用。反面是一台机器里又算账、又打印、又弹窗。正确:算的机器只管算账并把结果 return,打印的机器只管打印。

④ 实战:封装会员折扣(calcDiscount)

规则:0 普通不打折、1 白银 95 折、2 黄金 9 折、3 钻石 8 折。这台机器只负责算折扣价,不打印不弹窗。

function calcDiscount(price, level) {
    let rate = 1;                  // 先默认不打折
    if (level === 1) rate = 0.95;  // 白银 → 95折
    else if (level === 2) rate = 0.9;  // 黄金 → 9折
    else if (level === 3) rate = 0.8;  // 钻石 → 8折
    return price * rate;           // 原价×折扣率,把结果递出去
}
calcDiscount(199, 2);   // 199×0.9 = 179.1

	

⑥ X.3 实战:用在哪 / 常见坑 / 怎么解决

① 用在哪:会员折扣计算、分页参数、可选配置项——都靠默认参数兜底。

② 常见坑:少传参数得到 NaN;一个函数里又算又打印又弹窗,乱成一锅。

③ 怎么解决:形参写 = 默认值;坚持单一职责——算的只 return,显示的单独打印。

一句话记住:多给扔掉、少给 undefined 会 NaN;ES6 用 投料口=默认值 兜底;单一职责——算账就 return、显示就打印;会员折扣把等级换成折扣率