简单封装数据类型检测方法toType和循环遍历方法each

简单封装数据类型检测方法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;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值