JavaScript不支持传统函数重载,但可通过运行时参数类型判断实现类似效果:用typeof识别基础类型(注意null陷阱),结合Array.isArray、instanceof或toString.call区分引用类型,优先采用鸭子类型检测行为特征,将类型分发逻辑抽离为映射表,并严格使用===避免隐式转换干扰。

JavaScript 本身不支持传统函数重载,但可以在一个函数内通过运行时判断参数类型,分发到不同处理逻辑——关键不是“定义多个同名函数”,而是“在一个函数里准确识别传进来的是什么”。
用 typeof + 特殊类型检测组合判断
基础类型用 typeof 足够:string / number / boolean / function / undefined;但要注意 typeof null === 'object' 是历史陷阱,需单独处理。对于 Array、Date、RegExp 等,不能只靠 typeof,得配合:
-
Array.isArray(val)判断数组(比val instanceof Array更可靠) -
val instanceof Date或Object.prototype.toString.call(val) === '[object Date]'判断日期 -
val && typeof val === 'object' && val.constructor === Object区分普通对象和类实例
优先用“鸭子类型”而非构造器名
比起检查 val.constructor.name,更推荐看它“有没有某个行为特征”:
- 有
val.length且typeof val[0] !== 'undefined'→ 类数组(如 arguments、NodeList) - 有
val.then且是函数 → 可能是 Promise - 有
val.map且是函数 → 大概率是数组或自定义集合 - 有
val.toJSON→ 可能是可序列化对象(如 moment、自定义模型)
把类型分发逻辑单独抽出来
别让主函数堆满 if-else。建议封装一个映射表,让类型和处理器一一对应:
立即学习“Java免费学习笔记(深入)”;
- 用 Map 存储:键是类型标识(如
'string'、'date'),值是处理函数 - 或用普通对象:
{ string: handleString, number: handleNumber, default: handleUnknown } - 类型识别函数统一返回标准类型名(如
getType(val)返回'array'、'date'),再查表调用
避免隐式转换干扰判断
JS 的宽松相等(==)和自动转换容易导致误判,所以:
- 用 === 比较原始值,不用
== - 对字符串数字(如
'123')不主动转成 number 再判断类型,先按原样识别 - 如果业务需要兼容字符串数字,明确写成
typeof val === 'string' && !isNaN(Number(val)),而不是依赖Number(val)的副作用


















