js中数据类型判断

远程桌面(RDP)共享USB设备全攻略:不止Hyper-V,你的加密狗和CH340串口也能远程用 本文详细介绍了远程桌面(RDP)共享USB设备的完整解决方案,包括加密狗和CH340串口设备的远程使用技巧。通过RemoteFX USB重定向技术,用户可以在远程会话中无缝使用本地USB设备,提升工作效率。文章涵盖企业级配置、典型设备实战案例及高级故障排除方法,是远程工作者的实用指南。 阅读详情

在 ECMAScript 规范中,共定义了 7 种数据类型

基础数据类型有6种: Null、Undefined、Number、 String、 Boolean 和 Symbol (es6 引入)

引用数据类型有1种:Object ,其又可细分为Array、Map、Set 等

那么,对于所给数据,我们该如何准确获取其数据类型呢?本文将就这一问题进行详细阐述。

前置代码

const nul = null
const undef = undefined
const num = 1
const str = 'test'
const bool = true
const symbol =  Symbol()
const obj = {}
const arr = []
const func = () => {}

1. typeof

typeof 是一个操作符,其右侧为待判断类型的数据,可以是一个值、一个变量或一个表达式,如typeof null、 typeof val、typeof (a === b) 等,其中 val、a 和 b 为变量名

1.1 示例
console.log(typeof nul)    // object
console.log(typeof undef)  // undefined
console.log(typeof num)    // number
console.log(typeof str)    // string
console.log(typeof bool)   // boolean
console.log(typeof symbol) // symbol
console.log(typeof obj)    // object
console.log(typeof arr)    // object
console.log(typeof func)   // function
  • 对于基本类型,除 null 以外,均可以返回正确的结果。

  • 对于引用类型,除 function 以外,一律返回 object 类型。

  • 对于 null ,返回 object 类型。

  • 对于 function 返回 function 类型。

1.2 缺陷

从上面的代码可以看到,使用typeof判断null的数据类型时, 得到的结果为object, 为什么会这样呢?

其实这是一个历史遗留问题,在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null 也因此返回 "object"。

使用typeof判断数据类型缺陷如下:

(1) 无法正确判断null值的数据类型。

(2) 无法获取引用数据类型的详细类型值。

2. instanceof

instanceof是一个操作符,用来判断对象的具体类,其左侧为待判断类型的对象, 右侧为一个类

2.1 示例
console.log(obj instanceof Object)    // true
console.log(arr instanceof Array)     // true
console.log(func instanceof Function) // true
2.2 原理

首先,我们需要简单了解一下原型链,数据的__proto__属性指向其原型,其原型的__proto__属性指向上一层原型。对于原型的获取与修改,不建议用__proto__直接操作,可以使用Reflect.getPrototypeOf()、Reflect.setPrototypeOf()

或Object.getPrototypeOf()、Object.setPrototypeOf()。

console.log(arr.__proto__)                // Object(0) []
console.log(Object.getPrototypeOf(arr))   // Object(0) []
console.log(Reflect.getPrototypeOf(arr))  // Object(0) []

实际上,instanceof 就是利用原型链来判断数据类型的,我们不妨来看看以下代码

class A {}
class B extends A {}

const b = new B()
console.log(b instanceof B)       // true
console.log(b instanceof A)       // true
console.log(b instanceof Object)  // true

console.log(B.prototype)      // A {}
console.log(A.prototype)      // {}
console.log(Object.prototype) // [Object: null prototype] {}
console.log(getProto(b))      // [ A {}, {}, [Object: null prototype] {} ]

// 获取原型链
function getProto (obj) {
    const protoArr = []
    let proto

    while (proto = Object.getPrototypeOf(obj)) {
        protoArr.push(proto)
        obj = proto
    }

    return protoArr
}

不难发现,当左侧对象为b,右侧类为B、A或Object时,表达式为true,同时我们也发现,B、A和Object所指向的原型,都在对象b的原型链上,由此不难得出,instanceof 是将右侧类所指向的原型与左侧对象原型链上的原型进行一一比较,当该原型存在于原型链上时,返回true。

在清晰instanceof的工作原理后,我们不妨手动实现一个instanceOf函数

console.log(instanceOf(b, B))       // true
console.log(instanceOf(b, A))       // true
console.log(instanceOf(b, Object))  // true

// 模拟实现instanceof
function instanceOf (obj, Class) {
    const protoArr = getProto(obj)
    return protoArr.some(it => it === Class.prototype)
}
2.3 缺陷

(1) 无法判断基础数据类型的类型值。

(2) 如果原型链发生改变,会导致判断结果不准确,代码举例如下

class B {}
const b = new B()

Object.setPrototypeOf(b, null)
console.log(b instanceof B)    // false

(3) 通过Symbol.hasInstance自定义instanceof在类上的行为,会导致判断结果不准确,代码举例如下

class MyArray {
    static [Symbol.hasInstance](instance) {
        return true;
    }
}
  
console.log({ a: 1 } instanceof MyArray); // true

3. constructor

每个对象都有其构造函数,通过构造函数,我们可以判断其数据类型

3.1 示例

null 和 undefined 是无效的对象,不存在constructor,不能用constructor判断数据类型

console.log(num.constructor)    // [Function: Number]
console.log(str.constructor)    // [Function: String]
console.log(bool.constructor)   // [Function: Boolean]
console.log(symbol.constructor) // [Function: Symbol]
console.log(obj.constructor)    // [Function: Object]
console.log(arr.constructor)    // [Function: Array]
console.log(func.constructor)   // [Function: Function]

console.log(num.constructor === Number)    // true
console.log(str.constructor === String)    // true
console.log(bool.constructor === Boolean)  // true
console.log(symbol.constructor === Symbol) // true
console.log(obj.constructor === Object)    // true
console.log(arr.constructor === Array)     // true
console.log(func.constructor === Function) // true
3.2 缺陷

(1) 无法判断null、undefined的数据类型。

(2) 对象的 constructor 是不稳定的,其依赖原型的constructor属性,当开发者修改原型后,可能会导致判断结果错误,如

function F () {}
function D () {}

const f = new F()
console.log(f.constructor) // [Function: F]

// 修改原型属性
F.prototype.constructor = D
console.log(f.constructor) // [Function: D]

4. toString()

4.1 示例

我们可以使用Object中的toString()方法来获取数据类型,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型具体用法如下:

Object.prototype.toString.call(data), data为待判断类型的数据

console.log(Object.prototype.toString.call(nul))    // [object Null]
console.log(Object.prototype.toString.call(undef))  // [object Undefined]
console.log(Object.prototype.toString.call(num))    // [object Number]
console.log(Object.prototype.toString.call(str))    // [object String]
console.log(Object.prototype.toString.call(bool))   // [object Boolean]
console.log(Object.prototype.toString.call(symbol)) // [object Symbol]
console.log(Object.prototype.toString.call(obj))    // [object Object]
console.log(Object.prototype.toString.call(arr))    // [object Array]
console.log(Object.prototype.toString.call(func))   // [object Function]
4.2 缺陷

无法精准判断自定义类对象的数据类型

class E {}
const e = new E()
console.log(Object.prototype.toString.call(e)) // [object Object]

5. 总结

方式名称缺陷
typeof(1) null值判断错误 (2) 引用数据类型无法精准判断
instanceof(1) 无法判断基础数据类型 (2) 修改原型可能导致判断错误 (3) 自定义行为可能导致判断错误
constructor(1) null、undefined无法判断 (2) 修改原型可能导致判断错误
toString()无法精准判断自定义类对象的数据类型

由表可知,不同情况下我们可以使用不同的判断方式

  • 判断基础数据类型:toString()
  • 判断非自定义引用数据类型:toString()、 instanceof 或 constructor
  • 判断自定义引用数据类型: instanceof 或 constructor
中兴FTTR光猫变简易OLT:低成本搭建全光监控与局域网实战指南 本文详细介绍了如何将中兴FTTR光猫改造为简易OLT设备,实现低成本全光监控与局域网扩展。通过LOID认证、桥接模式设置及终端数破解,用户可利用二手设备搭建高性能光纤网络,适用于远程监控和长距离组网场景,显著降低部署成本。 阅读详情

相关推荐

LilyPad三色LED共阳极控制:从原理到Arduino编程实战

RGB LED作为可编程光源的核心组件,通过红、绿、蓝三原色的加色混合原理,能够生成丰富的色彩。其内部结构主要分为共阳极和共阴极两种类型,这决定了驱动电路的设计和编程逻辑。在电子织物和可穿戴设备领域,掌握RGB LED的控制技术对于实现动态光效和交互反馈至关重要。本文以LilyPad三色LED为例,深入解析其共阳极特性,并详细演示如何结合Arduino进行PWM编程,从而精准控制颜色与亮度,为智能服装、互动艺术装置等项目提供可靠的照明解决方案。

weixin_30237719的博客 615

null只有和null和undefined比较才会返回true

什么是null,undefined javascript高级程序设计: 使用var声明变量但未对其加以初始化时这个变量的值是undefined。 null值则是表示空对象指针。 所以typeof null返回object typeof undefined  // undefined typeof null     // object null只有和null和undefined比较才会返回tru...

chenxiang0708的博客 940

YOLOv8傻瓜式教程

YOLOv8傻瓜式教程,附带详细参数配置。

Father_of_Python的博客 1万+

前端面试(JavaScript)

引用数据类型判断 1.instanceof() 判断一个实例是否属于某种类型,例如: [1,2,3] instanceof Array ----- true new Date(‘2019/01/05’) instanceof Date -------true 实现原理: 是只要 右边变量的 prototype 在 左边变量的原型链上即可。因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,如果查找失败,则会返回 false,表示左边变量并非是右边变量

weixin_44420339的博客 269

OpenIddict实战:5步搞定.NET Core应用的OIDC单点登录集成

本文详细介绍了如何使用OpenIddict在.NET Core应用中快速实现OIDC单点登录集成。通过五个关键步骤,包括环境准备、数据库集成、客户端注册、令牌配置和多应用SSO集成,帮助开发者高效构建安全的企业级单点登录解决方案。

lambda的博客 728

6.4 实战项目:基于Agent内核构建Code Review智能体

本文介绍了一个基于Agent内核构建的智能Code Review系统实战项目。系统采用多Agent协作架构,包含代码质量分析、安全漏洞识别、性能优化建议等核心功能模块。文章详细展示了系统架构设计,采用协调器Agent管理多个专业Agent协同工作,并提供了基础Agent框架和协调器Agent的TypeScript实现代码。项目结合了AI Agent核心原理和多Agent协作机制,实现了自动化的代码审查流程,能够生成详细的审查报告,帮助开发者提升代码质量和安全性。

yonggeit的博客 3114

javascript — 当做false的值以及typeof (val)

javascript 中被当做false的值: a. false b. null c. undefined d. 数字0 e. 空字符串 d.数字NaN 简单测试: [code="java"] javascript var a='';//"" var b=NaN; va...

dahai2008_gsb的专栏 255

基于Simulink实现电动汽车电机驱动系统的建模与仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车电机驱动系统的建模与仿真。该系统能够全面评估电机驱动系统的性能,验证控制策略的有效性,并通过优化设计提高车辆的动力性和效率。引入智能预测:结合人工智能技术,实现更智能的控制策略。扩展功能:增加对多种电机类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 318

JS数据类型

数据类型

weixin_45393020的博客 266

C和C++Everything教程的简介

C和C++Everything教程的简介 C和C++Everything教程,该专栏目前已有8000博文,订阅该专栏相当于同时订阅以下所有收费专栏

希望我的博客,能帮上你解决学习中工作中所遇到的问题 4392

RAGFlow 系列教程 第14课:GraphRAG -- 知识图谱增强检索

RAGFlow v0.25.0深度解读了GraphRAG技术,通过构建知识图谱解决传统RAG在多跳推理问题上的局限。系统支持General GraphRAG和Light GraphRAG两种实现,包含四阶段构建流程:实体关系抽取、实体消解、社区检测和图持久化。核心代码位于rag/graphrag目录,采用LLM驱动的抽取机制,结合编辑距离和LLM确认的实体消解策略,以及Leiden社区检测算法。KGSearch模块通过多信号融合检索(实体+关系+N-hop+社区)实现高效查询。该系统将非结构化文本转化为可推

weixin_43674738的博客 101

java判断数据类型

1、基本数据类型。如byte、short、char、int、long、float、double、boolean,这些的比较用==。 2、对象数据类型。如Integer,String,List,Collection,Map。 (1)方法一:使用对象变量.getClass().getName(),如: String s = "jessica"; System.out.println(s.getClass().getName()); // 输出结果:java.

zhan_qian的博客 3万+

完整复现YOLOv8:包括训练、测试、评估、预测阶段【本文源码已开源,地址在文章末尾】

(这里主要是在colab.research.google.com实现的,本地的配置也是类似的方法)YOLOv8是一种用于目标检测的深度学习算法。主要参考:https://github.com/ultralytics/ultralytics/blob/main/README.zh-CN.md。yolov8的权重:https://github.com/ultralytics/assets/releases。yolov8的文档:https://v8docs.ultralytics.com/

源代码杀手的博客 1万+

js/java script各种判断数据类型的方法

js如何判断(复杂)数据类型 <给各位小白的各种判断数据类型讲解> 首先是JS的数据类型 基本有5种基本数据类型:String,Number,Boolean,Null,undefined。 1种复杂的数据类型Object,比如Object、array、function、date等。 ES6新增了一种基本数据类型symbol 1. Object.prototype.toString.call()(推荐使用) 该方法最繁琐,但最通用(简单和复杂类型都可以检测) let a = []; let

m0_52022213的博客 516

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JavaScript篇:JS数据类型大乱斗:谁才是类型判断的王者?

大家好,我是小杨,一个在前端圈子里摸爬滚打多年的开发者。今天咱们来聊聊 JavaScript的数据类型,以及如何准确判断它们。

欢迎来到我的前端博客!这里汇集了关于前端开发的最新技术、实用工具和经验分享。我将为你提供详细的教程、代码示例和实战案例,帮助你掌握Web开发的核心概念和技能。不论你是初学者还是有经验的开发者,这个博客都适合你。 1084

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[Javascript]:JS数据类型、类型判断、函数function与Function的使用

因为之前学过Java,在学习JS时,对JS的数据类型、function和Function的使用概念容易搞混淆,理解不怎么深刻。遂将这些知识点和概念梳理一遍,以便自己和他人理解。如有错误,敬请谅解。       知识点会涉及到:JS数据类型、JS的类型判断方式、函数创建方式、function与Function的区别、匿名函数的使用、函数特点以及函数重载问题。 Javascript数据类型

我只是个程序员。 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JavaScript判断是否为数值类型 - js的数据类型

需求 数值,或者数值型字符串,比如"123"可以通过校验。 其他类型不能通过校验。 举例 输入 结果 145 √ “145” √ “145ccc” × true × undefined × null × 对象 × 分析 首先要明确,js中一共有7种数据类型: 数值;字符串;布尔值;undefined;null;对象;symbol(ES6) 其中,对象包括:狭义的对象(object);数组(array);函数(function) 根据需求,我们需要的是先判断是数值或

weixin_43924896的博客 5442

JavaScript学习总结(2)——JavaScript数据类型判断

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33744141的博客 205

js 判断各种数据类型

/** * 判断各种js数据类型 */ export default { /** * 判断是否是字符串 * @param value * @returns {boolean} */ isString(value) { return typeof value === "string"...

qq_38358436的博客 247

js数据类型判断

js数据类型判断一共有四种方法 typeof、instanceof、constructor、Object.prototype.toString.call()、jquery.type() 下面我来为大家一一的介绍一下 1、typeof 基本数据类型中:Number,String,Boolean,undefined 以及引用数据类型中Function ,可以使用typeof检测数据类型,分别返回对应的数据类型小写字符。 另:用typeof检测构造函数创建的Number,String,Boolean都返回ob

weixin_58032613的博客 1万+

JavaScript 中四种常见的数据类型判断方法

本文比较了 JS 中常用的数据类型判断方法, 我们探讨了它们的适用场景和注意事项, 这些方法在面试中也是常见的问题, 深入了解这些方法可以帮助我们准确判断数据类型, 提高代码质量和可靠性....

潜隐-前端 3440

JavaScript——判断js数据类型(类型检测)

1、typeof运算符 typeof算是最常见的了,使用它会返回一个字符串,适合函数对象和基本类型(js中的基本类型:number、string、boolean、null、undefined、object[对象])的判断。 console.log("测试number:"+typeof 1); console.log("测试string:"+typeof "str"); console.l

yCharlee的博客 4万+

JavaScript中的数据类型判断方法最全总结

在 JavaScript 中,主要有七种基本数据类型Undefined、Null、Boolean、Number、String、Symbol、BigInt,还有一种复杂数据类型Object,其中包含了Data、function、Array、RegExp等。JavaScript 不支持任何创建自定义类型的机制,而所有值最终都将是上述8种数据类型之一。由于JavaScript 是一种动态类型语言,这意味着你可以在程序执行过程中改变变量的类型。 基本数据类型与引用数据类型的区别:基本数据类型是指存放在栈(stac

幽幽谷 1589
上一篇: js数组中indexOf和findIndex的区别
下一篇: js中console的使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值