javascript通过运行时参数判断(个数、类型、行为)模拟函数重载,核心是统一入口+动态分发;支持按参数个数、类型、鸭子类型分发,并可封装映射式分发器提升复用性。

JavaScript 本身不支持传统函数重载,但可以通过运行时判断参数特征(如个数、类型、结构或行为),让一个函数名对应多种逻辑路径,从而模拟出多态效果。关键不是语法层面的重载,而是用统一入口 + 动态分发实现“同一调用,不同行为”。
按参数个数分发逻辑
这是最直接的方式,适合功能相近、仅入参数量不同的场景,比如加法、求和、范围累加等。
- 用 arguments.length 或剩余参数 ...args 获取实参个数
- 用 if-else 或 switch 匹配不同长度,执行对应分支
- 注意:避免把所有逻辑塞进一个函数,可拆成独立处理函数提升可读性
按参数类型区分处理路径
当传入 string、number、array、Date、自定义类实例等不同类型时,需针对性处理。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 typeof 判断基础类型(注意
typeof null === 'object') - 用 Array.isArray() 准确识别数组
- 对对象类值,优先用 Object.prototype.toString.call() 或 instanceof 辅助判断
- 避免过度依赖
constructor.name,因它可能被篡改或压缩混淆
用鸭子类型识别对象意图
不关心对象“是什么”,只关心它“能做什么”。这是 JS 风格的多态核心。
- 检查对象是否具有某个方法或属性,例如
if ('format' in obj && typeof obj.format === 'function') - 适用于通用工具函数,如
serialize(data):对 Date 调用toISOString(),对 URL 调用toString(),对普通对象做 JSON 序列化 - 比严格类型检测更灵活,也更符合 JS 的动态特性
封装可复用的分发器
把判断逻辑抽离出来,主函数只负责路由,便于测试、扩展和复用。
- 用对象字面量或 Map 存储 类型/个数 → 处理函数 的映射关系
- 例如:
{ 'string': formatString, 'date': formatDate, 'object': formatJSON } - 支持运行时注册新类型处理器,无需修改主逻辑
- 柯里化可配合该模式,实现
sum(1)(2)和sum(1, 2)同时兼容
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










