当前位置: 首页 > news >正文

JavaScript类型检测【全】

类型检测的方法:

  1. typeof
  2. instanceof
  3. Object.prototype.toString
  4. constructor

typeof

typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

typeof undefined;
// "undefined"typeof null;
// "object"typeof 100;
// "number"typeof NaN;
// "number"typeof true;
// "boolean"typeof 'foo';
// "string"typeof function () {};
// "function"typeof [1, 2];
// "object"typeof new Object();
// "object"

typeof 操作符适合对 基本类型(除 null 之外)及 function 的检测使用,而对引用数据类型(如 Array)等不适合使用。

instanceof

instanceof 运算符用于检测一个对象在其 原型链 中是否存在一个构造函数的 prototype 属性。

左操作数为对象,不是就返回 false,右操作数必须是 函数对象 或者 函数构造器,不是就返回 TypeError 异常。

function Person() {}
function Student() {}
Student.prototype = new Person();
Student.prototype.constructor = Student;const ben = new Student();
ben instanceof Student;
// trueconst one = new Person();
one instanceof Person;
// true
one instanceof Student;
// false
ben instanceof Person;
// true

任何一个构造函数都有一个 prototype 对象属性,这个对象属性将用作 new 实例化对象的原型对象。

📍 instanceof 适合用于判断对象是否属于 Array、Date 和 RegExp 等内置对象。

📍 不同 window 或 iframe 之间的对象类型检测无法使用 instanceof 检测。

Object.prototype.toString

可以通过 toString() 来获取每个对象的类型。

为了 每个对象 都能通过 Object.prototype.toString 来检测,需要以 Function.prototype.call 或者 Function.prototype.apply 的形式来调用,传递要检查的对象作为第一个参数。

Obejct.prototype.toString.call(undefined)//  "[object Undefined]"Obejct.prototype.toString.call(null)//  "[object Null]"Obejct.prototype.toString.call(true)//  "[object Boolean]"Obejct.prototype.toString.call('')/// "[object String]"Obejct.prototype.toString.call(123)//  "[object Number]"Obejct.prototype.toString.call([])//  "[object Array]"Obejct.prototype.toString.call({})//  "[object Object]"

💡 使用 Object.prototype.toString 方法能精准地判断出值的数据类型。

⚠️ 注意事项:

方法重写:Object.prototype.toString 属于 Object 的原型方法,而 Array 或 Function 等类型作为 Object 的实例,都重写了 toString 方法。因此,不同对象类型调用 toString 方法时,调用的是重写后的 toString 方法,而非 Object 上原型 toString 方法,所以采用 xxx.toString() 不能得到其对象类型,只能将 xxx 转换成字符串类型。

constructor

任何对象都有 constructor 属性,继承自原型对象,constructor 会指向构造这个对象的构造器或构造函数。

Student.prototype.constructor === Student;
//  true

数组检测

ECMAScript5 将 Array.isArray() 正式引入 JavaScript,该方法能准确检测一个变量是否为数组类型。

Array.isArray(variable);

相关文章:

  • 20240116-唯一出现次数
  • Java后端学习路线
  • ssh -T git@github.com Connection timed out 解决方案-自测有效
  • 【征稿进行中|见刊快速】2024年社会发展与艺术鉴赏国际学术会议(IACSDAA 2024)
  • uniapp如何实现跨端适配
  • vite+vue3创建项目及开发常见的问题
  • 【数据结构和算法】反转链表
  • 在国产操作系统下管理MYSQL数据库
  • zabbix其他配置
  • 微信小程序实战-03翻页时钟-3
  • Chrome 浏览器 Manifest V3 版本中 scripting API 解析
  • pytorch学习(一)线性模型
  • C++设计模式(李建忠)笔记1
  • 【特征工程】分类变量:MultiLabelBinarizer对多标签数据进行编码
  • Spring IOC 之加载 BeanDefinition
  • [Vue CLI 3] 配置解析之 css.extract
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android开源项目规范总结
  • Golang-长连接-状态推送
  • Java到底能干嘛?
  • Java基本数据类型之Number
  • KMP算法及优化
  • mysql常用命令汇总
  • python_bomb----数据类型总结
  • spring boot 整合mybatis 无法输出sql的问题
  • ubuntu 下nginx安装 并支持https协议
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • webpack入门学习手记(二)
  • yii2权限控制rbac之rule详细讲解
  • 创建一种深思熟虑的文化
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 我与Jetbrains的这些年
  • 新书推荐|Windows黑客编程技术详解
  • 优化 Vue 项目编译文件大小
  • 【云吞铺子】性能抖动剖析(二)
  • 通过调用文摘列表API获取文摘
  • ​决定德拉瓦州地区版图的关键历史事件
  • #define与typedef区别
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (C++17) optional的使用
  • (poj1.3.2)1791(构造法模拟)
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (三)docker:Dockerfile构建容器运行jar包
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net wcf memory gates checking failed
  • .NET 表达式计算:Expression Evaluator
  • .NET 的程序集加载上下文
  • .NET6 命令行启动及发布单个Exe文件
  • .NET命名规范和开发约定
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .Net组件程序设计之线程、并发管理(一)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • /bin、/sbin、/usr/bin、/usr/sbin