js中精确判断对象类型--关于typeof 和Object.prototype.toString方法的区别

2023-11-19

在javascript中可以使用typeof来判断数据类型,但typeof只能判断区分基本类型,即number、string、boolean、undefinded和object这5种

        <script type="text/javascript">
            //基本数据类型:number、string、boolean、null、undefined
            //复杂数据类型(引用数据类型):object(Array、Data、RegExp、function)
            alert(typeof 1);  //number;
            alert(typeof true);  //boolean;
            alert(typeof undefined);  //undefined;
            alert(typeof "hello world")   //string;

            alert(typeof {});  //object;
            alert(typeof null); //object,  null是一个空对象;
            alert(typeof function(){});   //function;
        </script>

如上:对于null(空对象)、数组、{}(对象)使用typeof判断数据类型,都会统一返回“object”字符串


要精确判断对象类型可以使用js中的Object.prototype.toString方法(判断对象属于那种内置对象类型);

eg:

var arr=[];
console.log(Object.prototype.toString.call(arr));  //结果是  "[object Array]"

在ES3中,Object.prototype.toString方法的在被调用的时候,会执行如下的操作步骤:
1. 获取this对象的[[Class]]属性的值;
2. 计算出“[object”+”第一步获取的属性值”+“]” 这3个字符串拼接后的新字符串;
3. 返回第2步计算出的新字符串;

其过程简单说来就是:
1. 获取对象的类名(对象类型)。
2. 然后将[object、获取的对象类型的名、]组合为字符串
3. 返回字符串 “[object Array]”

[[Class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中,[[Class]]是这么定义的:
内部属性,[[Class]] 一个字符串值,表明了该对象的类型


由于 JavaScript 中一切都是对象,任何都不例外,对所有值类型应用 Object.prototype.toString.call() 方法结果如下:

        <script type="text/javascript">
            console.log(Object.prototype.toString.call(123))    //"[object Number]"
            console.log(Object.prototype.toString.call('123'))    //"[object String]"
            console.log(Object.prototype.toString.call(undefined))    //"[object Undefined]"
            console.log(Object.prototype.toString.call(true))    //"[object Boolean]"
            console.log(Object.prototype.toString.call(null))    //"[object Null]"
            console.log(Object.prototype.toString.call({}))    //"[object Object]"
            console.log(Object.prototype.toString.call([]))    //"[object Array]"
            console.log(Object.prototype.toString.call(function(){}))    //"[object Function]"
        </script>

如上可以看到:Object.prototype.toString.call()可以精确的判断对象类型;


判断是否为函数

   function isFunction(it) {
        return Object.prototype.toString.call(it) === '[object Function]';
    }

有兼容性问题,全面的写法是:

 function isArray(arr){  //自己封装的一个函数isArray(),用于判断函数传入的参数是否是数组;
                if(typeof Array.isArray === "undefined"){  //Array.isArray()是ES5中新增的方法,先判断下其是否是undefined,如果是未定义的话执行该段函数,定义一个Array.isArray()方法;
                    Array.isArray = function(brr){  //如果未定义,则定义函数并传入参数;
                        return Object.prototype.toString.call(brr)=="[object Array]"  //通过js中的Object.prototype.toString方法,返回一个判断,假设参数对象值属于数组内置类型,判断时,如果返回true则是数组,否则不是;
                    }
                }
                return Array.isArray(arr);  //返回该方法,调用isArray()相当于调用Array.isArray();
            }

如上是判断数组,其他判断类似;

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

js中精确判断对象类型--关于typeof 和Object.prototype.toString方法的区别 的相关文章

  • 在 config() 模块中注入依赖项 - AngularJS

    目前在 app js 中我有以下路线 var gm angular module gm gm services gm directives gm filters gm controllers ngSanitize gm config rou
  • 为什么我会收到此 Javascript 错误“连接未定义”?

    我不确定为什么会收到此错误 connection is not defined document getElementById flashTest sendValFromHtml connection value 这是我的代码 functi
  • 如何在 Nodejs - mongodb 搜索中对结果进行排序,但是,通过调用动态方法

    我正在 Nodejs 中开发一个 Web 应用程序 通过 mongo 本机连接器连接到 mongodb 在我的一个 js 文件中 我有一个通用方法来调用 find 或 findOne 操作以从 mongodb 集合中检索我需要的任何内容 如
  • 如何根据D3中的数据创建元素?

    看着sample https github com mbostock d3 wiki Selections wiki data d3 select body selectAll div data 4 8 15 16 23 42 enter
  • toastr (jquery) 只能显示一次

    你能帮我限制烤面包机的外观吗 给定的情况是 当我登录系统时 欢迎 toastr 只会在主屏幕上出现一次 并且在整个会话中不会再次出现 直到我注销为止 这是我的 toastr 代码 setTimeout function toastr opt
  • 将相同的多个对象推送到多个数组中

    这是后续使3个数组相互对应 第一个是对象名称 https stackoverflow com questions 57564488 make 3 arrays correspond to each other with the first
  • 如何避免多系列折线图d3.js的工具提示重叠

    我已经在多系列折线图上创建了工具提示 如下所示在这里回答 https stackoverflow com questions 34886070 d3 js multiseries line chart with mouseover tool
  • Socket.io 如何判断某人何时离开

    我正在使用 socket io 创建一个实时游戏 目前 当有人离开时 什么也不会发生 我想以某种方式通知服务器说谁离开了 有没有办法在用户离开时发出正确的信息 我可以让服务器每 1000 毫秒对每个人执行一次 ping 操作 或者通过其他方
  • (IE 特定)如何确定输入的文本是否比输入元素的宽度长

    这是所有版本 IE 特有的问题 在所有其他浏览器中 当文本溢出时 输入元素的scrollWidth 大于输入元素的clientWidth 有没有办法确定IE中输入字段中的文本超出了输入元素宽度的键 下面是一个检查 clientWidth 与
  • 计算div中有多少个元素

    我有一个div 里面有span 有没有一种方法可以计算 div 中有多少个元素 然后将其作为值给出 例如 一个 div 中有 5 个跨度 那么它会对其进行计数并发出警报 5 请使用 JavaScript 谢谢 如果你想要后代的数量 你可以使
  • 如何在 的每四个循环项之后添加

    我想在循环中的每第四个数字项之后退出循环 我想创建一个二十人的名单 在每一个tr应该是4个人 So I want to break from the loop after every 4th number of loop My one tr
  • 如何将毫秒转换为可读的日期?

    下列 new Date 1324339200000 toUTCString Outputs Tue 20 Dec 2011 00 00 00 GMT 我需要它返回Dec 20 除了我可以使用的更好的方法之外toUTCString 我正在寻找
  • 优化重叠矩形的绘制

    我有很多矩形 有些与其他矩形重叠 每个矩形都有一个绝对 z 顺序和一个colour 每个 矩形 实际上是粒子效果 网格或纹理的轴对齐边界框 并且可能是半透明的 但只要您不尝试剔除其他矩形后面的矩形 就更容易抽象地思考彩色矩形 所以我将在问题
  • 使用 Moment.js 从 ISO 字符串中提取 utcOffset

    使用 moment js 我尝试从 ISO 日期字符串中提取偏移量 以便稍后在格式化纪元时间戳时使用该偏移量 以确保时间戳的转换位于同一时区 即使字符串中的偏移量为 0400 结果始终为0 var currentTime 2015 03 1
  • c3js数据标签的位置

    有没有可能的方法来更改数据上方标签的位置c3条形图 在官方文档中 很好地解释了如何通过操作 y 和 x 整数来更改 x 和 y 测量轴上标签的位置 但我没有找到任何数据标签 我试图用简单的方式指出它d3其上c3是基于但是console lo
  • 如何在没有查询参数的情况下重新加载页面?

    假设我想重新加载www domain com abc num 4 但我想重新加载www domain com abcONLY 问号后没有所有内容 window location window location href split 0
  • js中将div旋转到一定高度

    How to rotate a div to certain height suppose 10px I can rotate a div otherwise around 360 degrees I need the angle by w
  • javascript捕获文本区域中的粘贴事件

    我目前有一个文本区域 我需要控制已粘贴的文本 本质上 我需要能够将用户想要粘贴到文本区域中的任何内容并将其放入变量中 然后我将计算出他们粘贴文本的位置和字符串的大小 以将其从文本区域中删除 然后最后用我自己的方式处理变量中的文本 我的问题
  • 在 Javascript 中使用 fetch API 接收和处理 JSON

    在我的项目中 当条件不足时 我的 Django 应用程序会发送带有消息的 JSON 响应 我使用这个 JsonResponse 指令 Code data is taken email email return JsonResponse da
  • 为什么转换 new.Date() .toISOString() 会改变时间?

    我正在以两种不同的格式在数据库中插入日期 这是作为日期时间插入 var mydate mydate new Date document getElementById clockinhour value mydate toISOString

随机推荐

  • 解决在WebStorm中使用Vue的v-bind,v-on报错

    1 报错详情 Namespace v bind is not bound Namespace v on is not bound 等 问题说明 出现这个错误不是代码本身的问题 而是 WebStorm 这个编辑器的问题 因为 WebStorm
  • [Android Studio] 第5节 Intent页面跳转

    目录 目录 一 Intent是什么 二 使用步骤 1 调转demo 2 详解 3 页面数据传递 一 Intent是什么 Intent是Android中用于在不同组件 如活动 服务 广播接收器 之间传递数据和执行操作的对象 它可以用于启动活动
  • docker的入门使用指南

    前段时间把docker装到了虚拟机上 今天学一学怎么使用docker 是照着这个up在B站的视频学习的链接 Docker快速入门 讲得非常好 我这里就是记一下笔记 一 docker的简介 1 1什么是Docker 简单来说是一个应用打包 分
  • Linux04-yum

    一 CentOS 镜像修改为阿里云yum 配置步骤如下 1 备份 mv etc yum repos d CentOS Base repo etc yum repos d CentOS Base repo backup 2 下载新的 Cent
  • C++11知识点——{}大括号的用法

    C 11提出 大括号新用法 如下 std vector
  • 智慧教室--智能管控系统

    智慧教室系统是一款基于AIOT数字化平台的智能教育解决方案 该系统实现了全面数字化 自动化管理和智能化控制 可大大提高教学效率和质量 为学生带来更加优质的教育体验 智能管控是智慧教室系统的核心功能之一 通过物联网技术 将教室内各种设备和设施
  • VUE 移动端只获取当前拍摄照片,不允许相册获取 及 input标签capture属性详解

    一 VUE移动端简单实现只获取当前拍摄照片demo
  • Snipaste介绍、安装、使用技巧(截图贴图工具)

    一 简介 Snipaste 是一个简单但强大的截图贴图工具 也可以让你将截图贴回到屏幕上 下载并打开 Snipaste 按下 F1 来开始截图 再按 F3 截图就在桌面置顶显示了 就这么简单 你还可以将剪贴板里的文字或者颜色信息转化为图片窗
  • mysql longblob binlog 解析_解析MYSQL BINLOG 二进制格式(4)--TABLE_MAP_EVENT

    展开阅读全文 原创 转载请说明出处谢谢 上接 http blog itpub net 7728585 viewspace 2133188 解析MYSQL BINLOG 二进制格式 1 准备工作 http blog itpub net 772
  • java 模拟电梯 状态模式_设计模式 状态模式

    状态模式允许一个对象在其内部状态改变时改变它的行为 用电梯来举例 电梯可以认为具有开门 关门 运行 停止四种状态 这四种状态之间的切换具有多种限制 比如在开门状态下不电梯不能运行 只能转为关门状态 在运行状态下 电梯只能转为停止状态 设想一
  • 使用javassist动态生成类

    目录 说明 配置环境 使用javassist生成类 使用javassist生成类并实现接口 说明 Javassist JAVA 编程 ASSISTant 使 Java 字节码操作变得简单 它是一个用 Java 编辑字节码的类库 它使 Jav
  • 常量池垃圾回收:判断类的存活

    方法区中的常量池也需要进行垃圾回收 主要回收对象是废弃的常量和无用的类 其中 判断类的存活需要同时满足以下3个条件 1 该类所有的实例已经被回收 即Java堆中已经不存在任何该类的实例 2 加载该类的ClassLoader已经被回收 3 该
  • jquery实现checkbox全选、取消全选

  • Mac用自带软件QuickTime Player进行录屏

    Mac电脑用自带软件QuickTime Player进行录屏的教程 几步就可以学会 挺简单的 1 首先 找到并打开QuickTime Player软件 可以鼠标右键这个图标 选择 选项 在程序坞中保留 这样 软件就固定在了Dock栏 方便以
  • 一串有趣的代码

    啊哈 已经来学校四五天了 日子还不错 前些天遇见一段蛮有趣的 代码段 在 窗口输出常量 给大家分享分享 称的上是程序员的一点小浪漫吧 Protected Sub Button1 Click sender As Object e As Eve
  • 人体姿态估计数据集

    数据集 1 PASCAL VOC challenge voc挑战在2005年至2012年间展开 该数据集中有20个分类 该数据集包含11530张用于训练和验证的图像 以下是数据集中20个分类 人 鸟 猫 牛 狗 马 羊 飞机 自行车 船 巴
  • 打包工具 Inno Setup 介绍

    Inno Setup 详解中文资料 其一 使用教程 一 Inno Setup 是什么 InnoSetup 是一个免费的 Windows 安装程序制作软件 第一次发表是在 1997 年 Inno Setup 今天在功能设置和稳定性上的竞争力可
  • CPU缓存一致性动态图

    https www scss tcd ie Jeremy Jones VivioJS caches MESI htm
  • mysql常用工具

    1 mysql 该mysql不是指mysql服务 而是指mysql的客户端工具 语法 mysql options database 参数 u user name 指定用户名 p password name 指定密码 h host name
  • js中精确判断对象类型--关于typeof 和Object.prototype.toString方法的区别

    在javascript中可以使用typeof来判断数据类型 但typeof只能判断区分基本类型 即number string boolean undefinded和object这5种