写一个判断数据类型的方法

/**
 * 判断数据类型
 * @param {*} data 需要判断类型的变量
 * @returns {string} 返回数据类型字符串
 */
function getType(data) {
  const type = Object.prototype.toString.call(data);
  switch (type) {
    case '[object String]':
      return 'String';
    case '[object Number]':
      return 'Number';
    case '[object Boolean]':
      return 'Boolean';
    case '[object Null]':
      return 'Null';
    case '[object Undefined]':
      return 'Undefined';
    case '[object Symbol]':
      return 'Symbol';
    case '[object Object]':
      return 'Object';
    case '[object Array]':
      return 'Array';
    case '[object Function]':
      return 'Function';
    case '[object Date]':
      return 'Date';
    case '[object RegExp]':
      return 'RegExp';
    case '[object Map]':
      return 'Map';
    case '[object Set]':
      return 'Set';
    case '[object WeakMap]':
      return 'WeakMap';
    case '[object WeakSet]':
      return 'WeakSet';
    case '[object BigInt]':
      return 'BigInt';
    default:
      return 'Unknown';
  }
}


// 测试用例
console.log(getType("hello")); // String
console.log(getType(123)); // Number
console.log(getType(true)); // Boolean
console.log(getType(null)); // Null
console.log(getType(undefined)); // Undefined
console.log(getType(Symbol())); // Symbol
console.log(getType({})); // Object
console.log(getType([])); // Array
console.log(getType(function(){})); // Function
console.log(getType(new Date())); // Date
console.log(getType(/abc/)); // RegExp
console.log(getType(new Map())); // Map
console.log(getType(new Set())); // Set
console.log(getType(new WeakMap())); // WeakMap
console.log(getType(new WeakSet())); // WeakSet
console.log(getType(123n)); // BigInt


// 简化版 (使用 typeof 和 instanceof,但不完全可靠)
function simpleGetType(data) {
  if (data === null) return 'Null'; // 特殊处理 null
  const type = typeof data;
  if (type !== 'object') return type;  // 基本类型直接返回
  if (data instanceof Array) return 'Array';
  if (data instanceof Date) return 'Date';
  if (data instanceof RegExp) return 'RegExp';
  return 'Object'; // 其他对象类型
}

// 简化版测试用例 (注意:简化版对某些类型的判断可能不准确)
console.log(simpleGetType("hello")); // String
console.log(simpleGetType(123)); // Number
console.log(simpleGetType(true)); // Boolean
console.log(simpleGetType(null)); // Null
console.log(simpleGetType(undefined)); // undefined
console.log(simpleGetType(Symbol())); // symbol
console.log(simpleGetType({})); // Object
console.log(simpleGetType([])); // Array
console.log(simpleGetType(function(){})); // function
console.log(simpleGetType(new Date())); // Date
console.log(simpleGetType(/abc/)); // RegExp
console.log(simpleGetType(new Map())); // Object (简化版无法区分 Map)
console.log(simpleGetType(new Set())); // Object (简化版无法区分 Set)

说明:

  • getType() (推荐): 这个函数使用 Object.prototype.toString.call(data) 方法,这是判断 JavaScript 数据类型最稳妥的方式,可以准确地区分各种内置对象类型,包括 MapSetWeakMapWeakSet 等。

  • simpleGetType() (简化版): 这个函数使用 typeofinstanceof 运算符,代码更简洁,但在某些情况下可能不够精确。例如,它无法区分 MapSet 和普通对象,都会返回 'Object'。 如果只需要区分基本类型和少数几种常见对象类型,可以使用这个简化版。

选择哪个版本取决于你的具体需求。 如果需要更精确的类型判断,建议使用 getType()。 如果只需要简单的类型判断,可以使用 simpleGetType()

补充:

  • 关于 null: typeof null 会返回 "object",这是一个历史遗
posted @ 2024-11-21 12:19  王铁柱6  阅读(17)  评论(0)    收藏  举报