判断js数据类型的方法

2023-05-16

基本类型

String,Number,Boolean,Undefined,Null,Symbol

引用类型

Object

但是有些时候我们需要的是把数组啊,函数啊,时间的这些全部分开了取判断,那么我们要怎么取处理呢?

一: typeof

typeof ''; // string 有效
typeof 1; // number 有效
typeof Symbol(); // symbol 有效
typeof true; //boolean 有效
typeof undefined; //undefined 有效
typeof null; //object 无效
typeof [] ; //object 无效
typeof new Function(); // function 有效
typeof new Date(); //object 无效
typeof new RegExp(); //object 无效
  • null 无效显示的object
  • function 显示的是function外其他的引用类型全部都是返回object类型

本来:null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型

为什么?

 typeof 对于这些类型(数组、日期、正则)的处理,只返回了处于其原型链最顶端的 Object 类型,没有错,但不是我们想要的结果

二:instanceof

instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。 在这里需要特别注意的是:instanceof 检测的是原型

问题来了就如同上面说的一个数组[]的原型即时Array,但是Array的原型也是Object那么这个空数组用instanceof检查的时候检查是不是对象的实时也是会返回true的?

[] instanceof Array; // true
{} instanceof Object;// true
new Date() instanceof Date;// true
 
function Person(){};
new Person() instanceof Person;
 
[] instanceof Object; // true
new Date() instanceof Object;// true
new Person instanceof Object;// true

为什么?

我们来分析一下 [ ]、Array、Object 三者之间的关系:

从 instanceof 能够判断出 [ ].__proto__  指向 Array.prototype,而 Array.prototype.__proto__ 又指向了Object.prototype,最终 Object.prototype.__proto__ 指向了null,标志着原型链的结束。因此,[]、Array、Object 就在内部形成了一条原型链:

依次类推,类似的 new Date()、new Person() 也会形成一条对应的原型链 

总结:instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型

instanceof的另一个问题:如果你从一个框架向另一个框架传入一个数组,那么就会有两给不用的全局执行环境,那么在A创建的数组,在B环境中用insetnceof判断就会为false这样的情况就可以使用ES5中的Array.isArray()f方法去判断是不是Array类型,而不去管是在那个环境中创建的

三:constructor

当一个函数 F被定义时,JS引擎会为F添加 prototype 原型,然后再在 prototype上添加一个 constructor 属性,并让其指向 F 的引用,其实也就算原型可以通过constructor来指向构造函数

例如:

当执行 var f = new F() 时,F 被当成了构造函数,f 是F的实例对象,此时 F 原型上的 constructor 传递到了 f 上,因此 f.constructor == F

    function F() { }
    var f = new F();
    console.log(f.constructor === F)  // true

指行结果

不好的原因:

1. null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。

2.数值型,需要new Number来判断

3. 函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor是在原型对象上的一个方法当字符方法被改写了,那么不就找不到这个方法了吗?为了规范开发,在重写对象原型时一般都需要重新给 constructor 赋值,以保证对象实例的类型不被篡改。但是还是不够稳定

四:toString.call()

对于 Object 对象,直接调用 toString()  就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息,因为其他对象题目都自己改写了toString()这个方法,但是我们要用Object这个原来的方法我们就用call

Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用

轮子

    function NnwTypeof(val) {
      let valType = Object.prototype.toString.call(val);
      if (valType === '[object String]') {
        return 'String'
      }
      if (valType === '[object Number]') {
        return 'Number'
      }
      if (valType === '[object Boolean]') {
        return 'Boolean'
      }
      if (valType === '[object Symbol]') {
        return 'Symbol'
      }
      if (valType === '[object Undefined]') {
        return 'Undefined'
      }
      if (valType === '[object Null]') {
        return 'Null'
      }
      if (valType === '[object Function]') {
        return 'Function'
      }
      if (valType === '[object Date]') {
        return 'Date'
      }
      if (valType === '[object Array]') {
        return 'Array'
      }
      if (valType === '[object RegExp]') {
        return 'RegExp'
      }
    }

参考https://www.cnblogs.com/onepixel/p/5126046.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断js数据类型的方法 的相关文章

  • JS如何优雅的删除对象中的指定属性?

    要优雅的话 xff0c 使用 Lodash 的 omit 方法移除不要的属性 xff1a const object 61 a 1 b 2 c 3 const result 61 omit object a c 61 gt b 2 或者用 p
  • python 使用 isdigit 判断字符串中是否只由数字组成

    span class token operator span span class token operator span span class token operator span span class token operator s
  • 快速排序详解(Java实现)

    一 快速排序的基本思想 每一轮的排序都会将区域分割成两个独立的分区 xff0c 其中左分区的序列的所有值均会比右分区的所有值小 然后对子分区进行同样的分割操作 xff0c 最后达到整体有序 在排序的过程中 xff0c 由于已经分开的两部分的
  • A*算法路径规划之Matlab实现

    A 算法路径规划之matlab实现 A 算法是一种传统的路径规划算法 xff0c 相较于Dijkstra算法 xff0c 其引入了启发式算子 xff0c 有效的提高了路径的搜索效率 主要步骤包括 xff1a 1 xff09 设置起始点 目标
  • C语言中‘a‘和“a“有什么区别?

    1 本质区别 双引号里面的是字符串 xff0c 而单引号里面的代表字符 2 输出区别 str 61 a 输出的就是a这个字母 xff1b str 61 a 输出的测试65 3 底层区别 用单引号引起的一个字符实际上代表一个整数 xff0c
  • linux VNC客户端登陆失败

    vnc登陆出现 Unknown authentication scheme from VNC server 解决办法 xff08 建议在做操作之前重启vnc server xff0c 密码输错过多可能导致一直连接失败 xff09 https
  • win 10 mstsc连接 RemoteApp

    本文是关于mstsc客户端的配置 xff08 服务端的配置本文不描述 xff09 xff0c 前提是服务端配好 xff0c 知道RemoteApp怎么玩的 windows 2008 的mstsc有个配置 xff0c 关于程序 的tab页 但
  • 贪心算法的改进

    关于贪心算法 xff0c 请看我的上一篇博客 解决贪心算法的复杂度 为解决贪心算法的复杂度 本文提出 xff1a 通过分解极大联通子图去寻找影响力最大的节点的算法 强连通 xff1a 在有向图G中 xff0c 如果任意两个不同的顶点相互可达
  • 非关系型数据库-redis应用场景

    关系型数据库与非关系型数据库 redis的应用场景 xff1a 1 redis由于数据的读取和操作都在内存当中操作 xff0c 读写的效率较高 xff0c 所以经常被用来做数据的缓存 把一些需要频繁访问的数据 xff0c 而且在短时间之内不
  • Linux创建用户后,登录报错/usr/bin/xauth: file /home/user/.Xauthority does not exist

    错误信息如下 usr bin xauth span class token function file span home user Xauthority does not exist 错误原因 是因为添加用户时没有授权对应的目录 xff0
  • VSCode测试ES6语法

    一 VsCode使用 1 1 VsCode基本操作 Alt 43 Shift 43 F格式化代码 二 ES6新特性 2 1 let声明常量 2 2 const声明常量 只读变量 2 3 解析表达式 2 3 1 数组解构 2 3 2 对象解构
  • VNC远程连接树莓派报错问题解决(文末有惊喜呦)

    用VNC远程连接树莓派 xff0c 出现拒绝连接 问题原因 xff1a 只设置了PC端的服务器 xff0c 但是没有在树莓派端开端口 解决办法 xff1a 用putty或者xshell连接树莓派 xff0c 输入命令 xff1a vncse
  • ReadFile函数

    函数功能 xff1a 该函数从文件指针指示的位置开始从文件读数据 xff0c 在读操作完成后 xff0c 如果文件句柄不是用重叠属性来创建 xff0c 则文件指针用实际读的字数来调整 如果文件句柄为重叠的输入和输出 xff08 I O xf
  • error MSB8041: 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。

    最近新安装了vs2019企业版 xff0c 用vs打开vs2015的工程出现如下错误 xff1a error MSB8041 此项目需要 MFC 库 从 Visual Studio 安装程序 单个组件选项卡 为正在使用的任何工具集和体系结构
  • PC和Android模拟器之间虚拟串口通信

    前言 很多时候我们在做串口通信的时候需要去模拟串口来调试 xff0c 这样可以极大的方便我们的工作 xff0c 不然的话可能需要连接硬件设备 xff0c 比较麻烦 一般情况下我们先在电脑上模拟串口后初步调试 xff0c 最后阶段在硬件设备上
  • 【C语言】将正数转成负数,将负数转成正数

    将正数转成负数 xff0c 将负数转成正数 include lt stdio h gt int change int num if num lt 0 num 61 num 1 else if num gt 0 num 61 num 43 1
  • C语言中的输入输出流和缓冲区(重点)详解

    导读 xff1a C语言中我们用到的最频繁的输入输出方式就是scanf 与printf scanf xff1a 从标准输入设备 键盘 读取数据 xff0c 并将值存放在变量中 printf xff1a 将指定的文字 字符串输出到标准输出设备
  • MFC下按钮自绘的实现

    MFC下按钮自绘的实现 MFC下按钮自绘的实现 xff08 一 xff09 在MFC下编程 xff0c 很多时候对于标准的按钮控件不是很满意 xff0c 想要弄的美观点 这就需要按钮自绘 这里简单记录一下方法 xff0c 以免过个十天半个月
  • Invalidaterect()函数的作用详细解释

    函数原型 xff1a BOOLInvalidateRect HWND hWnd handle of window withchanged update region 窗口句柄 CONST RECT lpRect address ofrect

随机推荐

  • 【Python小白学习——错误解决3】RuntimeWarning: More than 20 figures have been opened

    待解决的问题 xff1a RuntimeWarning More than 20 figures have been opened Figures created through the pyplot interface 96 matplo
  • ffmpeg修改视频文件的分辨率

    在本文中 xff0c 我们将展示如何调整任何视频文件的大小 这种方法是在Linux系统 xff08 几乎任何发行版 xff09 中调整视频文件大小的最佳方法之一 xff0c 也是Windows和Mac用户的绝佳替代方案 更改视频文件的分辨率
  • SQLServer安装教程(史上最详细版本)

    下载 安装包已上传至百度网盘 xff0c 安装包里已含注册码 xff0c 下载地址 xff08 含注册码 xff09 链接 xff1a https pan baidu com s 147YRI7DdCqTOTKfe9UNtiA 提取码 xf
  • 通过 GetFileVersionInfo 获取EXE 或 DLL的各种资源

    查找网上资源甚多 xff0c 但无一个代码能用 xff0c 甚憾 自已阅读MSDN资料 xff0c 终于写得下面代码 xff0c 经测试通过 xff0c 若有问题请发邮件给我 xff0c 谢谢 xff01 struct LANGANDCOD
  • Tab控件的使用(二)

    tab控件其实只是提供了一组标签按钮 xff0c 其相互切换有响应的消息 xff0c 而且实现了对这些按钮管理的功能 至于通过这些标签按钮来管理我们自己的界面那就要我们通过其提供的各种方法自己实现了 xff0c 这一方面减轻了tab控件自身
  • (转载)MFC -- radio button 的用法

    本文转自http cao416451347ming blog 163 com blog static 1154556162009102795016258 先为对话框加上2个radio button xff0c 分别是Radio1和Radio
  • Linux给普通用户添加sudo权限

    在对 Linux 进行各种操作时 xff0c 为了安全起见 xff0c 一般不使用root用户直接对系统进行操作 原因 在linux中root的权限非常大 xff0c 比如我们常开玩笑的命令 rm rf xff0c 这都是可以直接执行的 而
  • Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

    1 socket概念 socket xff08 套接字 xff09 xff0c 用于网络中不同主机间进程的通信 socket是一个伪文件 xff0c 包含读缓冲区 写缓冲区 socket必须成对出现 socket可以建立主机进程间的通信 x
  • MySQL client does not support authentication protocol requested by server问题解决

    问题描述 xff1a 1251 Client does not support authentication protocol reuqested by server consider upgrading MySQL client 问题分析
  • kubernetes--集群环境搭建

    本文将搭建一套master node node k8s集群环境 xff0c 需要准备三台至少cpu gt 2G mem gt 2G的虚拟机 xff0c 步骤如下 xff1a 1 在所有节点配置hosts并节点间的连接性 分别在三个节点配置h
  • 数据库服务器的安装与配置

    理论基础 数据库服务器是当今应用最为广泛的一种服务器类型 xff0c 许多企业在信息化建设过程中都要购置数据库服务器 数据库服务器主要用于存储 查询 检索企业内部的信息 xff0c 因此需要搭配专用的数据库系统 xff0c 对服务器的兼容性
  • IDEA刷新与清除缓存

    idea清除缓存 刷新项目 idea刷新与清除缓存的正确菜单 Build Project xff1a 更新Project下所有的Module Build Module xff1a 更新指定的Module Rebuild Project xf
  • VNC远程桌面安装配置

    VNC远程桌面安装配置 服务器 xff1a Linux centos 7 0 客户端 xff1a Windows 10 1 服务器安装vnc服务端2 编辑vnc配置文件3 客户端安装4 解决端口访问的问题 1 服务器安装vnc服务端 直接用
  • 第1章 计算机基础知识

    1 1 计算机的基本概念 xff08 1 xff09 计算机的发展 计算机的诞生 1946年第一台电子数字计算机ENIAC由美国宾夕法尼亚大学研制成功 它是一个庞然大物 xff0c 共有18000个电子管 1500个继电器 xff0c 耗电
  • WIN7系统下搭建Docker,部署ODL与mininet

    1 docker 安装 版本 xff1a 18 03 win7系统下和win10系统稍有不同 安装流程 xff1a https www runoob com docker windows docker install html 由于国外源问
  • Debian10中文环境配置

    在安装系统的时候会有一个语言区域选项 xff0c 不管当时选的什么 xff0c 在这里都可以更改 同时解决中文乱码问题 以下操作最好在root用户下进行 xff0c root用户操作起来方便一些 xff0c 不会被权限困扰 换源 最好在做所
  • Redis删除key

    Redis 删除 key 的方式分为两种 xff0c 一种是单独删除指定的 key xff0c 另一种是根据通配符进行批量删除 1 删除指定的 key 1 登录 Redis 客户端 redis cli 注 xff1a 如果提示 Redis
  • Jlink下载stm32cube生成的程序会出现No Cortex-M SW Device Found错误,下载的第一次没事,第二次就会报错

    Jlink下载stm32cube生成的程序会出现No Cortex M SW Device Found错误 xff0c 下载的第一次正常 xff0c 第二次就会报错的问题 作为写stm32的神器stm32cubemx越来越多人开始使用 xf
  • Hadoop 典型Writable类详解

    Hadoop 典型Writable类详解 Hadoop将很多Writable类归入org apache hadoop io包中 xff0c 在这些类中 xff0c 比较重要的有Java基本类 Text Writable集合 ObjectWr
  • 判断js数据类型的方法

    基本类型 String xff0c Number xff0c Boolean xff0c Undefined xff0c Null xff0c Symbol 引用类型 Object 但是有些时候我们需要的是把数组啊 xff0c 函数啊 xf