javascript通过运行时参数类型识别实现函数重载,用typeof+特殊检测区分基础与引用类型,优先鸭子类型判断行为特征,再以映射表分发处理逻辑,全程使用严格相等避免隐式转换干扰。

JavaScript 本身不支持原生函数重载,但可以通过运行时判断参数类型,把不同类型的输入分发到对应处理逻辑中——核心是“识别传进来的是什么”,而不是定义多个同名函数。
用 typeof + 特殊检测组合识别基础与引用类型
基础类型(string / number / boolean / undefined / function)可用 typeof 直接判断;但注意 typeof null === 'object' 是历史遗留陷阱,需单独处理。引用类型不能单靠 typeof:
-
Array.isArray(val)比val instanceof Array更可靠,推荐用于数组检测 -
Object.prototype.toString.call(val) === '[object Date]'可安全识别 Date、RegExp、Map 等内置对象 - 普通对象和类实例可结合
val && typeof val === 'object' && val.constructor === Object区分
优先按“行为特征”做鸭子类型判断
比起检查构造器名或 toString 结果,更实用的是看它“能不能干某件事”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 有
val.length且typeof val[0] !== 'undefined'→ 类数组(如 arguments、NodeList) - 有
val.then且是函数 → 很可能是 Promise - 有
val.map且是函数 → 大概率是数组或具备映射能力的集合 - 有
val.toJSON方法 → 可能是可序列化对象(如 moment、自定义模型)
把类型分发逻辑抽离成映射表
避免主函数堆满 if-else。封装一个类型识别函数,统一返回标准类型名(如 'string'、'date'、'promise'),再用 Map 或对象查表调用处理器:
- 用
Map:键为类型标识,值为处理函数,适合动态注册 - 用普通对象:
{ string: handleString, date: handleDate, default: handleUnknown } - 主函数只负责识别 + 查表 + 执行,职责清晰,易测试、易扩展
全程使用严格相等,防止隐式转换干扰
类型判断阶段必须杜绝 == 和自动转换带来的误判:
- 原始值比较一律用 ===
- 不主动对字符串数字(如
'123')调用Number()再判断类型 - 若业务确实需要兼容字符串数字,应显式写出转换逻辑,而非依赖类型判断中的副作用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










