← 返回目录

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

参数就是函数的入口,调用时传进去,函数内部用形参接收。

核心三种:
普通参数——function fn(a,b) { }
默认参数——function fn(a=10) { } 没传就用默认值
arguments——函数内部所有实参的集合

坑:实参和形参数量可以不等、默认参数只在 undefined 时生效、arguments 不是真数组

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

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

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

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

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

// 只给2个料 → c 是空 → 1+2+空 = NaN
add(1, 2);

// 给4个料 → 多的那个扔掉,只用1+2+3=6
add(1, 2, 3, 4);

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

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

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

// c 没给 → 用默认0 → 1+2+0=3
add(1, 2);

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

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

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

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

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

// 199×0.9 = 179.1
calcDiscount(199, 2);

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

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

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

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

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

本页重点

API作用参数返回值代码示例
形参定义时括号里的小名字名字接住调用传来的值
function sum(a, b) {

  return a + b;
}
f(a=1)默认值:没传就用 1名字=默认值
function f(a = 1) {

  return a;
}
多传的实参JS 不报错,多的收不到任意个忽略
sum(1, 2, 3);  // 第3个被忽略
arguments旧写法收齐所有实参类数组
function f() {
  console.log(arguments.length);
}