当前位置: 首页 > news >正文

给函数参数设置默认值的方式

在 JavaScript 中,给函数参数设置默认值主要有以下几种方式:

1. 函数体内手动检查赋值(ES5 及以前)

在函数内部检查参数是否为 undefined,然后手动赋值默认值。

function greet(name, age) {name = name !== undefined ? name : 'Guest';age = age !== undefined ? age : 18;return `Hello, ${name}! You are ${age} years old.`;
}console.log(greet()); // "Hello, Guest! You are 18 years old."
console.log(greet("Alice", 30)); // "Hello, Alice! You are 30 years old."

2. 短路运算符(||)

使用逻辑或运算符(||)为参数提供默认值,但这种方式会将所有假值(如 0false'')都替换为默认值,可能导致意外结果

function greet(name, age) {name = name || 'Guest';age = age || 18;return `Hello, ${name}! You are ${age} years old.`;
}console.log(greet()); // "Hello, Guest! You are 18 years old."
console.log(greet("", 0)); // "Hello, Guest! You are 18 years old." ❌ 不符合预期

3. ES6 箭头函数 + 解构赋值

结合箭头函数和解构赋值,为参数对象的属性设置默认值

const greet = ({ name = 'Guest', age = 18 } = {}) => {return `Hello, ${name}! You are ${age} years old.`;
};console.log(greet()); // "Hello, Guest! You are 18 years old."
console.log(greet({ name: "Alice" })); // "Hello, Alice! You are 18 years old."

4. ES6 参数默认值(最推荐)

直接在函数参数列表中为参数赋值默认值,这是 ES6 引入的标准语法,简洁且语义明确

function greet(name = 'Guest', age = 18) {return `Hello, ${name}! You are ${age} years old.`;
}console.log(greet()); // "Hello, Guest! You are 18 years old."
console.log(greet("Alice")); // "Hello, Alice! You are 18 years old."

特点

  • 只有当参数为 undefined 时才会触发默认值(传递 null 不会触发)。
  • 可以使用前面已定义的参数计算后续参数的默认值:

    javascript

    function calculate(total = 100, discount = total * 0.1) {return total - discount;
    }
    console.log(calculate()); // 90
    

5. 对象解构 + 默认值

当函数接受一个对象参数时,通过解构赋值为对象属性设置默认值。

function greet(options) {const { name = 'Guest', age = 18 } = options;return `Hello, ${name}! You are ${age} years old.`;
}console.log(greet({ name: "Alice" })); // "Hello, Alice! You are 18 years old."
console.log(greet()); // ❌ 报错:Cannot destructure property 'name' of 'options' as it is undefined.

改进: 为整个参数设置空对象默认值,避免不传参时的错误:

function greet({ name = 'Guest', age = 18 } = {}) {// ...
}
console.log(greet()); // "Hello, Guest! You are 18 years old."

6. 函数调用时动态计算默认值

将默认值设置为一个函数调用,每次调用原函数时动态生成默认值。

function getDefaultAge() {return new Date().getFullYear() - 2000;
}function greet(name = 'Guest', age = getDefaultAge()) {return `Hello, ${name}! You are ${age} years old.`;
}console.log(greet()); // "Hello, Guest! You are 25 years old." (假设当前年份是 2025)

总结对比

方式优点缺点
ES6 参数默认值简洁、语义明确、标准语法仅支持 undefined 触发
对象解构适合复杂参数结构需要额外处理不传参的情况
短路运算符简单易用会误判所有假值(如 0''
函数体内赋值兼容性好(ES5 及以前)代码冗余

最佳实践

  • 简单参数:优先使用 ES6 参数默认值。
  • 复杂参数对象:结合对象解构和默认值,避免传入空对象时的错误。
  • 动态默认值:通过函数调用生成默认值,确保每次调用时计算最新值。

选择合适的方式可以让你的代码更简洁、更健壮!

相关文章:

  • 【密码学——基础理论与应用】李子臣编著 第八章 SM2公钥密码算法 课后习题
  • 坐标转换:从WGS-84到国内坐标系(GCJ-02BD-09)
  • Android 系统的兼容性测试 - CTS Verifier、GTS、VTS、STS 等
  • BG开发者日志0427:故事的起点
  • 组件的基本知识
  • 0基础 | Proteus | 中断 | 点阵
  • 移除生产环境所有console.log
  • Unity:Sprite Shapes(精灵形状)
  • 4.27算法题
  • 【计算机网络性能优化】从基础理论到实战调优
  • QT中的事件及其属性
  • 如何理解promise 续一
  • 2025 网络安全技术深水区探索:从 “攻防对抗” 到 “数字韧性” 的范式跃迁
  • ts全局导入接口
  • 深入浅出提示词工程(结合 DeepSeek)
  • C++翻转数相乘 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
  • 从数据孤岛到智能决策:健康管理系统如何打通企业健康大数据?
  • Shell脚本-while循环应用案例
  • Redux-Saga vs Redux-Thunk
  • 【C++QT】Layout 布局管理控件详解
  • 黄晓丹:用“诗心”找到生存的意义
  • 澎湃思想周报丨数字时代的育儿;凛冬已至好莱坞
  • 凝聚多方力量,中国农科院油菜产业专家团部署单产提升新任务
  • 在上海生活8年,13岁英国女孩把城市记忆写进歌里
  • 江苏、安徽跨省联动共治“样板间”:进一扇门可办两省事
  • 夜读丨囿于厨房与爱