JS类型判断之typeof、instanceof与toString示例详解

 更新时间:2026年03月31日 09:19:21   作者:发现一只大呆瓜  
在javascript开发中,准确判断数据类型是处理变量和对象的基础操作,这篇文章主要介绍了JS类型判断之typeof、instanceof与toString的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在 JavaScript 的世界里,准确判断一个变量的类型并不像看上去那么简单。为什么 typeof nullobject?为什么 instanceof 不能判断基本类型?本文将带你通过底层逻辑彻底搞定这些面试重难点。

一、 typeof:快速但有“缺陷”的选择

typeof 是最常用的判断方式,它直接返回一个表示类型的字符串。

1. 判断表现

  • 基本类型:除了 null 之外,都能显示正确结果(string, number, boolean, undefined, symbol, bigint)。

  • 引用类型

    • 函数:返回 "function"
    • 其他(数组、正则、日期、普通对象) :统一返回 "object"

2. 这里的坑:为什么 typeof null === 'object'?

底层原理: JavaScript 的底层变量是使用二进制存储的。为了提高性能,引擎通过二进制的前三位(Type Tag)来判断类型:

  • 000:对象(Object)
  • 1:整数
  • 010:浮点数
  • 100:字符串
  • 110:布尔值

而 null 的所有二进制位都是 0,因此它的前三位也是 000。早期的 JS 实现中没有对 null 进行特判,导致它被误判为了对象。这是一个历史遗留的 Bug,但为了兼容性一直没有修复。

二、 instanceof:基于原型链的“探亲”

instanceof 可以判断对象是属于哪种类型,它的内部机制是通过判断对象的原型链中是不是能找到该类型的 prototype.

1. 查找机制

只要右边变量的 prototype 在左边变量的原型链上就会返回ture,因此instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果原型链遍历完都没有找到,就会返回 false,告诉我们左边变量并不是右边变量的实例

2. 手写实现(面试常考)

手写 instanceof 的核心在于循环向上遍历原型链

  function myInstanceof(obj, func) {
    if (typeof obj !== 'object' && typeof obj !== 'function') {
      return false;
    }
    let proto = obj.__proto__;
    const prototype = func.prototype;
    while (proto !== prototype) {
      if (proto === null) {
        return false;
      }
      proto = proto.__proto__;
    }
    return true;
  }
  const date = new Date();
  console.log(myInstanceof(date, Object));    // true
  console.log(myInstanceof([1, 2], Array)); // true

三、 终极方案:Object.prototype.toString

如果你需要一个万能精准的判断方式,那么非它莫属。

1. 原理

调用该方法会返回一个格式为 [object Type] 的字符串,其中 Type 就是该值的内部属性 [[Class]]

2. 测试表现

const toString = Object.prototype.toString;
console.log(toString.call(Math));      // [object Math]
console.log(toString.call('a'));       // [object String]
console.log(toString.call(null));      // [object Null]
console.log(toString.call(undefined)); // [object Undefined]
console.log(toString.call([]));        // [object Array]
console.log(toString.call(new Date())); // [object Date]

四、 面试模拟题(实战演练)

Q1:如何判断一个变量是否是数组?

参考回答:

  1. Array.isArray(arr)(首选,ES6标准方法)。
  2. Object.prototype.toString.call(arr) === '[object Array]'(最通用)。
  3. arr instanceof Array(注意:如果是在跨 iframe 环境下,原型链不同可能会失效)。

Q2:typeof []和typeof {}的结果分别是什么?

参考回答: 都是 "object"。因为 typeof 除了函数以外,对于所有的引用类型都会返回 "object"

Q3:执行2 instanceof Number的结果是什么?为什么?

参考回答: 结果是 false。 因为 instanceof 只能用于检测对象实例。数字 2 是原始值(Primitive),它没有原型链。如果想让它返回 true,需要写成 new Number(2) instanceof Number

总结

  • typeof:适合判断基本类型(除 null)和函数。
  • instanceof:适合判断对象之间的继承关系。
  • toString:适合需要百分百准确判断类型的场景。

到此这篇关于JS类型判断之typeof、instanceof与toString的文章就介绍到这了,更多相关JS类型判断typeof、instanceof与toString内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript私有变量实例详解

    JavaScript私有变量实例详解

    这篇文章主要介绍了JavaScript私有变量,结合实例形式分析了javascript私有变量的常见定义及访问方法,需要的朋友可以参考下
    2019-01-01
  • PHP捕捉异常中断的方法

    PHP捕捉异常中断的方法

    相信每位PHP程序员都知道,当PHP程序出现异常情况,如出现致命错误、超时或者不可知的逻辑错误导致程序中断,这个时候就可以用 register_shutdown_function进行异常处理。下面本文给出了详细的示例代码,有需要的朋友们下面来一起看看吧。
    2016-10-10
  • JavaScript使用encodeURI()和decodeURI()获取字符串值的方法

    JavaScript使用encodeURI()和decodeURI()获取字符串值的方法

    这篇文章主要介绍了JavaScript使用encodeURI()和decodeURI()获取字符串值的方法,实例分析了encodeURI()和decodeURI()函数解析字符串的相关技巧,需要的朋友可以参考下
    2015-08-08
  • 基于js里调用函数时,函数名带括号和不带括号的区别

    基于js里调用函数时,函数名带括号和不带括号的区别

    下面小编就为大家带来一篇基于js里调用函数时,函数名带括号和不带括号的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • JavaScript如何正确的写代码注释

    JavaScript如何正确的写代码注释

    这篇文章主要给大家介绍了关于JavaScript如何正确的写代码注释的相关资料,注释的作用是提高代码的可读性,帮助自己和别人阅读和理解你所编写的JavaScript代码,注释的内容不会在网页中显示,需要的朋友可以参考下
    2023-10-10
  • 详解webpack异步加载业务模块

    详解webpack异步加载业务模块

    本篇文章主要介绍了webpack异步加载业务模块 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • ​​​​​​​基于el-table和el-pagination实现数据的分页效果流程详解

    ​​​​​​​基于el-table和el-pagination实现数据的分页效果流程详解

    本文主要介绍了​​​​​​​基于el-table和el-pagination实现数据的分页效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-11-11
  • JavaScript时间戳与时间相互转换的常用方法

    JavaScript时间戳与时间相互转换的常用方法

    这篇文章主要介绍了JavaScript时间戳与时间相互转换的常用方法,包括获取当前时间戳、时间戳转时间对象、时间戳转格式化字符串、时间字符串转时间戳等,还讨论了常见应用场景如计算时间差、倒计时和UTC与本地时间互转,需要的朋友可以参考下
    2025-04-04
  • JS实现的按钮点击颜色切换功能示例

    JS实现的按钮点击颜色切换功能示例

    这篇文章主要介绍了JS实现的按钮点击颜色切换功能,涉及js鼠标事件响应及页面元素属性动态操作相关实现技巧,需要的朋友可以参考下
    2017-10-10
  • js中json处理总结之JSON.parse

    js中json处理总结之JSON.parse

    parse是解析json数据多种方法中的其中一种。这篇文章主要介绍了js中json处理总结之JSON.parse,需要的朋友可以参考下
    2016-10-10

最新评论