简单封装数据类型检测方法toType和循环遍历方法each
- 数据类型检测方法toType
实际项目开发时,往往需要对数据进行数据类型检测,根据检测的结果的不同从而进行不同的操作。但是目前已有的检测方法都要么不够全面,要么不够简洁,所以我们自己简单的封装一个检测数据类型的方法。(可能也不够全面,单足够用了)
function toType(data) {
if (typeof data !== 'object') return typeof data;
if (typeof data === 'object' && data == null) return 'null';
let obj = {},
type = obj.toString.call(data),
result;
type.replace(/\[object (\w+)\]/, (q, p) => {
result = p.toLowerCase();
})
return result;
}
- 循环遍历方法each
我们知道,在真实项目开发中,常常需要对数组和对象进行一些遍历操作,但是已有的对于数组的遍历方法forEach并不支持循环中断;使用for in循环遍历数组,又无法获取数组的Symbol类型的属性。基于此,我们简单封装一个既可以在遍历对象时获取到对象的Symbol类型的属性,又可以根据自己的需要在遍历对象/数组时,中断遍历。
function each(obj, callback) {
if (toType(obj) !== 'array' && toType(obj) !== 'object') throw new TypeError('obj must be an object');
if (toType(obj) === 'array' || isArrayLike(obj)) {
for (let i = 0; i < obj.length; i++) {
if (callback.call(obj[i], obj[i], i) === false) break;
}
} else {
let keys = Object.keys(obj);
if (typeof Symbol !== 'undefined') {
keys = keys.concat(Object.getOwnPropertySymbols(obj));
}
for (let i = 0; i < keys.length; i++) {
let item = keys[i];
if (callback.call(obj[item], obj[item], item) === false) break;
}
}
}
辅助函数 isArrayLike
// 辅助函数:判断一个对象是否为类数组对象
function isArrayLike(obj) {
if (typeof obj !== 'object') return false;
if (obj == null) return false;
let len = obj.length;
if (len && typeof len !== 'number') return false;
return len === 0 || len > 0 && (len - 1) in obj;
}