1. typeof 与 instanceof 合理使用
- 策略:
typeof
用于判断基本数据类型(除 null
),instanceof
用于判断对象的类型,确保使用场景正确。例如判断数字 typeof num === 'number'
;判断数组 arr instanceof Array
。
- 优势:
typeof
速度快,适用于基本类型判断。instanceof
能准确判断对象是否为特定构造函数的实例。
- 劣势:
typeof null
返回 'object'
是个历史遗留问题。instanceof
不能跨 iframe 判断对象类型,因为不同 iframe 有不同的全局对象,导致构造函数不一致。
2. 缓存判断结果
- 策略:对于频繁判断的数据,将判断结果缓存起来。比如使用一个对象来存储已经判断过的数据的类型。
const typeCache = {};
function getTypeCached(data) {
if (typeCache[data]) {
return typeCache[data];
}
let type;
if (Array.isArray(data)) {
type = 'array';
} else if (typeof data === 'object') {
type = 'object';
} else {
type = typeof data;
}
typeCache[data] = type;
return type;
}
- 优势:减少重复计算,提高效率,尤其适用于大量重复数据的判断场景。
- 劣势:占用额外内存空间,缓存数据过多时可能导致性能下降,且数据变化时需要更新缓存。
3. 使用 Object.prototype.toString.call()
- 策略:通过
Object.prototype.toString.call()
可以准确判断所有数据类型,例如 Object.prototype.toString.call([]) === '[object Array]'
,Object.prototype.toString.call({}) === '[object Object]'
。
- 优势:判断全面且准确,能正确区分
null
、undefined
、数组、对象等各种数据类型,不受跨 iframe 影响。
- 劣势:相比
typeof
性能略低,因为涉及函数调用和字符串比较。
4. 提前退出优化
- 策略:在进行复杂判断前,先进行简单条件判断,满足简单条件则提前得出结论。例如先判断是否为
null
或 undefined
,如果是则直接返回相应类型,无需后续复杂判断。
function getType(data) {
if (data === null) {
return 'null';
}
if (data === undefined) {
return 'undefined';
}
if (Array.isArray(data)) {
return 'array';
}
// 其他判断
}
- 优势:减少不必要的复杂计算,提高效率,尤其适用于数据可能为
null
或 undefined
比例较高的场景。
- 劣势:增加代码复杂度,需要根据实际数据特点合理安排判断顺序。