JavaScript类型判断的多种方法

 更新时间:2026年01月15日 09:00:22   作者:BillKu  
本文介绍了JavaScript中多种类型判断方法,包括基础类型判断、数组判断、null判断、复杂类型判断、构造函数实例判断、NaN判断、类型安全比较等,并提供了一些实用建议,帮助开发者编写更健壮的JavaScript代码,需要的朋友可以参考下

在JavaScript中,类型判断有多种方法,各有优缺点。以下是全面的类型判断指南:

1.typeof 操作符

最基本的类型判断,适用于原始类型:

typeof "hello"      // "string"
typeof 42           // "number"
typeof true         // "boolean"
typeof undefined    // "undefined"
typeof Symbol()     // "symbol"
typeof 123n         // "bigint"
typeof function(){} // "function"

// 局限性:
typeof null         // "object" (历史遗留问题)
typeof []           // "object"
typeof {}           // "object"
typeof new Date()   // "object"

2.instanceof 操作符

检查对象是否是特定构造函数的实例:

[] instanceof Array           // true
new Date() instanceof Date    // true
[] instanceof Object          // true (原型链上)

// 局限性:
"hello" instanceof String     // false
123 instanceof Number         // false

3.Object.prototype.toString.call()

最可靠的类型判断方法:

Object.prototype.toString.call("hello")     // "[object String]"
Object.prototype.toString.call(42)          // "[object Number]"
Object.prototype.toString.call(123n)        // "[object BigInt]"
Object.prototype.toString.call(true)        // "[object Boolean]"
Object.prototype.toString.call(null)        // "[object Null]"
Object.prototype.toString.call(undefined)   // "[object Undefined]"
Object.prototype.toString.call([])          // "[object Array]"
Object.prototype.toString.call({})          // "[object Object]"
Object.prototype.toString.call(new Date())  // "[object Date]"
Object.prototype.toString.call(/regex/)     // "[object RegExp]"
Object.prototype.toString.call(function(){})// "[object Function]"
Object.prototype.toString.call(Symbol())    // "[object Symbol]"

4.专用判断方法

数组判断

Array.isArray([])           // true (ES5+,最可靠)
[] instanceof Array         // true
Object.prototype.toString.call([]) === '[object Array]'  // true

// 旧浏览器兼容方法
function isArray(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
}

NaN 判断

isNaN(NaN)                  // true (有问题:会尝试转换类型)
isNaN("hello")              // true

Number.isNaN(NaN)           // true (ES6,推荐)
Number.isNaN("hello")       // false

// 替代方案:
function isNaN(value) {
    return value !== value;  // NaN是唯一不等于自身的值
}

空值判断

// 严格相等判断
value === null      // 判断null
value === undefined // 判断undefined

// 双等号判断(可能产生意外转换)
value == null       // true if value is null or undefined

// 安全检查
if (value != null) {
    // value既不是null也不是undefined
}

5.实用类型判断函数

// 获取准确类型
function getType(value) {
    return Object.prototype.toString.call(value)
        .replace(/^\[object (\w+)\]$/, '$1')
        .toLowerCase();
}

// 类型判断工具函数
const TypeChecker = {
    isString: val => typeof val === 'string',
    isNumber: val => typeof val === 'number' && !isNaN(val),
    isBoolean: val => typeof val === 'boolean',
    isUndefined: val => val === undefined,
    isNull: val => val === null,
    isObject: val => 
        val !== null && typeof val === 'object' && !Array.isArray(val),
    isArray: val => Array.isArray(val),
    isFunction: val => typeof val === 'function',
    isDate: val => val instanceof Date,
    isRegExp: val => val instanceof RegExp,
    isError: val => val instanceof Error,
    isSymbol: val => typeof val === 'symbol',
    isBigInt: val => typeof val === 'bigint',
    isPromise: val => 
        Boolean(val && typeof val.then === 'function'),
    
    // 判断原始类型
    isPrimitive: val => 
        val === null || 
        typeof val === 'string' ||
        typeof val === 'number' ||
        typeof val === 'boolean' ||
        typeof val === 'undefined' ||
        typeof val === 'symbol' ||
        typeof val === 'bigint',
    
    // 判断类数组对象(有length属性)
    isArrayLike: val => 
        val != null && 
        typeof val !== 'function' && 
        typeof val.length === 'number'
};

// 使用示例
TypeChecker.isArray([1, 2, 3])          // true
TypeChecker.isObject({ a: 1 })          // true
TypeChecker.isPrimitive(42)             // true

6.ES6+ 新增方法

// Number类型判断
Number.isInteger(42)        // true
Number.isInteger(42.0)      // true
Number.isInteger(42.5)      // false
Number.isSafeInteger(42)    // true

// 数组类型判断
Array.isArray([])           // true

// Symbol类型
typeof Symbol() === 'symbol'

// BigInt类型
typeof 123n === 'bigint'

7.特殊情况的处理

// 判断是否为纯对象(排除数组、函数等)
function isPlainObject(obj) {
    return Object.prototype.toString.call(obj) === '[object Object]' &&
           Object.getPrototypeOf(obj) === Object.prototype;
}

// 判断是否为DOM元素
function isElement(obj) {
    return !!(obj && obj.nodeType === 1);
}

// 判断是否为空对象
function isEmptyObject(obj) {
    return isPlainObject(obj) && Object.keys(obj).length === 0;
}

// 判断是否为数值(包括字符串数字)
function isNumeric(value) {
    return !isNaN(parseFloat(value)) && isFinite(value);
}

8.最佳实践建议

  1. 基础类型判断:使用 typeof
  2. 数组判断:使用 Array.isArray()
  3. null判断:使用 value === null
  4. 复杂类型判断:使用 Object.prototype.toString.call()
  5. 构造函数实例判断:使用 instanceof
  6. NaN判断:使用 Number.isNaN()
  7. 类型安全比较:优先使用 === 而不是 ==

9.TypeScript中的类型判断

// 类型守卫
function isString(value: any): value is string {
    return typeof value === 'string';
}

// 使用示例
function process(value: string | number) {
    if (isString(value)) {
        // TypeScript知道这里是string类型
        console.log(value.toUpperCase());
    }
}

选择哪种方法取决于具体需求,但掌握这些技术可以帮助你编写更健壮的JavaScript代码。

以上就是JavaScript类型判断的多种方法的详细内容,更多关于JavaScript类型判断方法的资料请关注脚本之家其它相关文章!

相关文章

  • HTML中的setCapture和releaseCapture使用介绍

    HTML中的setCapture和releaseCapture使用介绍

    setCapture函数的作用就是将后续的mouse事件都发送给这个对象,releaseCapture就是将鼠标事件还回去,由 document、window、object之类的自行来处理。这样就保证了在拖动的过程中,不会由于经过了其它的元素而受到干扰
    2012-03-03
  • js中实现字符串和数组的相互转化详解

    js中实现字符串和数组的相互转化详解

    这篇文章主要介绍了js中实现字符串和数组的相互转化,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • JavaScript基于libgif.js实现控制gif动画帧

    JavaScript基于libgif.js实现控制gif动画帧

    这篇文章主要为大家详细介绍了JavaScript如何利用libgif.js插件控制gif动画帧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • 文件上传,iframe跨域数据提交的实现

    文件上传,iframe跨域数据提交的实现

    下面小编就为大家带来一篇文件上传,iframe跨域数据提交的实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • JS中call()和apply()的功能及用法实例分析

    JS中call()和apply()的功能及用法实例分析

    这篇文章主要介绍了JS中call()和apply()的功能及用法,结合实例形式详细分析了JS中call()和apply()的功能、区别、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-06-06
  • JavaScript实现打地鼠游戏

    JavaScript实现打地鼠游戏

    这篇文章主要为大家详细介绍了JavaScript实现打地鼠游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • js仿百度音乐全选操作

    js仿百度音乐全选操作

    这篇文章主要为大家详细介绍了js仿百度音乐全选操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • JavaScript实现焦点进入文本框内关闭输入法的核心代码

    JavaScript实现焦点进入文本框内关闭输入法的核心代码

    这篇文章给大家分享js实现焦点进入文本框内关闭输入法,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09
  • 小程序表单认证布局及验证详解

    小程序表单认证布局及验证详解

    这篇文章主要为大家详细介绍了小程序表单认证布局及验证的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • JavaScript中innerHTML,innerText,outerHTML的用法及区别

    JavaScript中innerHTML,innerText,outerHTML的用法及区别

    在javascript中如果我们要获取对象内容,js为我们提供了三种方法outerhtml、innerhtml和innertext,但他们之间具体怎么使用与具体的区别在哪里,可能很多人不知道吧,接下来跟着小编一起来学习innerHTML,innerText,outerHTML的用法及区别吧。
    2015-09-09

最新评论