下面是一个全面的 JavaScript 类型检测方法,它结合了 typeof、instanceof 和 Object.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"
370

被折叠的 条评论
为什么被折叠?



