JavaScript 万能类型检测方法

下面是一个全面的 JavaScript 类型检测方法,它结合了 typeof、instanceofObject.prototype.toString.call() 的优势,并通过正则表达式提取精确的类型信息。

/**
 * 万能类型检测方法
 * @param {any} value - 需要检测的值
 * @returns {string} - 返回详细的类型字符串
 */
function getType(value) {
  // 处理 null 和 undefined
  if (value === null) return 'null';
  if (value === undefined) return 'undefined';

  // 处理基本类型
  const type = typeof value;
  if (type !== 'object' && type !== 'function') return type;

  // 使用 Object.prototype.toString 获取更精确的类型
  const toString = Object.prototype.toString.call(value);
  const typeString = toString.slice(8, -1).toLowerCase(); 
  //slice(8, -1) 这个操作是为了从 "[object Type]" 字符串中提取出 Type 部分:
  //slice(8):从第8个字符开始截取(跳过前面的 "[object " 这8个字符)
  //slice(8, -1):从第8个字符截取到倒数第1个字符(去掉最后的 "]")

  // 特殊处理一些类型
  if (typeString === 'object') {
    // 检查常见对象类型
    if (value.constructor) {
      if (value.constructor.name !== 'Object') {
        return value.constructor.name.toLowerCase();
      }
    }
    
    // 检查是否是 Promise
    if (typeof value.then === 'function' && typeof value.catch === 'function') {
      return 'promise';
    }
    
    // 检查是否是普通对象
    return 'object';
  }

  // 处理其他情况
  return typeString;
}

// 测试用例
console.log(getType(123));              // "number"
console.log(getType('hello'));          // "string"
console.log(getType(true));             // "boolean"
console.log(getType(null));             // "null"
console.log(getType(undefined));        // "undefined"
console.log(getType(Symbol('sym')));    // "symbol"
console.log(getType(BigInt(123)));      // "bigint"
console.log(getType([]));               // "array"
console.log(getType({}));               // "object"
console.log(getType(new Date()));       // "date"
console.log(getType(/regex/));          // "regexp"
console.log(getType(function() {}));    // "function"
console.log(getType(new Map()));        // "map"
console.log(getType(new Set()));        // "set"
console.log(getType(new Error()));      // "error"
console.log(getType(new Promise(() => {}))); // "promise"
console.log(getType(new String('str'))); // "string" (注意:对象包装的字符串)
console.log(getType(new Number(123)));  // "number" (注意:对象包装的数字)



function PerSen(name) {

    this.name = name
}

let lily = new ProSen('lily')
console.log(getType(lily));   // "PerSen" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值