假如你面前的是B站面试官
问:怎么实现一个函数能按指定类型过滤出数组中的对象?
我:?
一、基础实现
核心需求 :实现函数filterByType(arr, type)
,从数组中筛选出指定类型的元素
typescript
function filterByType(arr, type) {
return arr.filter(item => {
if (type === 'array') return Array.isArray(item)
return typeof item === type
})
}
关键缺陷:
- 无法正确处理
null
(typeof null === 'object'
) - 对象类型包含数组等特殊类型
- 缺少对现代JS类型(如Symbol)的支持
二、类型深度解析
JavaScript类型判断的复杂性体现在:
- 原始类型 :
undefined
,boolean
,number
,string
,bigint
,symbol
- 对象类型 :
object
,function
,array
,Date
等 - 特殊值 :
null
(伪对象类型)
类型判断方法对比:
方法 | 优点 | 缺点 |
---|---|---|
typeof | 快速判断原始类型 | 无法区分null/array |
instanceof | 判断构造函数 | 跨iframe失效 |
Object.prototype.toString | 精确判断所有类型 | 需要处理返回字符串 |
Array.isArray | 专用数组判断 | 仅适用于数组 |
什么叫跨iframe失效
在 JavaScript 中,跨执行环境失效 特指 instanceof
等类型判断方法在不同全局作用域(如 iframe、Web Worker、Node.js 的 vm
模块等)中失效的现象。其本质原因是:不同执行环境拥有独立的内置构造函数,导致原型链无法匹配。
三、进阶实现
typescript
function filterByType(arr, type) {
return arr.filter(item => {
if (type === 'array') {
return Array.isArray(item);
} else if (type === 'null') {
return item === null;
} else if (type === 'object') {
return item !== null && typeof item === 'object' && !Array.isArray(item);
} else {
return typeof item === type;
}
});
}
四、总结
希望能给各位大佬以后面B站的时候一点点点点点小启发