首页 > 其他分享 >JS判断数据类型的9种方法

JS判断数据类型的9种方法

时间:2023-12-26 17:32:25浏览次数:33  
标签:判断 console log object 数据类型 JS Object toString

JS 的数据类型检测是一道经典的八股文面试题。相信大家都能条件反射的回答出 4 种方法:typeof、constructor、instanceof 和 Object.prototype.toString,并且对它们各自的优缺点也是张口就来。

本文对这些方法做了简单归纳,同时又补充了其他 5 种和数据类型检测有关的方法,供诸君食用。

typeof:检测基础数据类型和函数很好用

typeof 应该是我学习到的第一个 JS 的方法,也是使用频率最高的一个用来检测数据类型的方法。

它能准确判断出的数据类型有:Number,String,Boolean,Undefined,Symbol,BigInt,Function。

它的缺点就是不能准确判断 null 的类型,而是返回 “object”。对于数组,日期,普通对象等数据,统一返回 “object”。

所以在判断基本数据类型(除了 null)和函数类型时,都会使用它。

constructor:返回实例对象的构造函数

学习 JS 到面向对象的阶段时,会学到 JS 的原型链和原型对象,会学到通过 new 一个构造函数,来创建实例对象。

构造函数的原型对象上会有一个 constructor 属性,指向了构造函数自身,所以实例对象通过原型链访问 constructor 属性,就能找到自己的构造函数,也就是自己的类型了。

它的本意是用来标识自己的构造函数,却临时拉来当壮丁,用来判断数据类型,当然也存在一定的风险:

  • null,undefined 没有构造函数,自然也就访问不到该属性,因此不能使用此属性来判断
  • constructor 可以被改写,所以不一定准确

来看几个例子:

console.log((1).constructor === Number) // true

console.log([1, 2, 3].constructor === Array) // true

console.log(undefined.constructor === Array) // 报错

在平时写代码时,基本上不会用它来做数据类型的检测。

instanceof:沿着原型链去找

它和 constructor 一样,也是临时拉来当壮丁。它的作用是检测实例对象是不是属于某个构造函数,可以用来做数据类型的检测。

术业有专攻,所以它也有缺点:

  • 不能检测基本数据类型
  • 原型链可能被修改,导致检测结果不准确
  • 只要能在原型链上找到构造函数,就返回 true,所以类型可能不准确

来看几个例子:

console.log(1 instanceof Number) // false

console.log([] instanceof Array) // true

console.log([] instanceof Object) // true

实际中 instanceof 也很少用。

Object.prototype.toString:是个大拿

看名字它是用来将一个值转为字符串的,但其实并不是,它是一个专门检测数据类型的方法。

它返回的值是一个形如 [object Object] 的字符串,比如:

console.log(toString.call('123'))        // [object String]
console.log(toString.call(null))         // [object Null]
console.log(toString.call(true))         // [object Boolean]
console.log(toString.call({}))           // [object Object]
console.log(toString.call([]))           // [object Array]
console.log(toString.call(function(){})) // [object Function]
console.log(toString.call(new Map))      // [object Map]
console.log(toString.call(new WeakSet))  // [object WeakSet]

通常会编写一个函数,对返回的字符串从第8位做一个截取,截取到倒数第一位,再去做类型比较。

Symbol.toStringTag:自定义类型

上面的 Object.prototype.toString 方法,之所以对不同的数据类型,返回不同的标识字符串,就是因为 Symbol.toStringTag

Symbol.toStringTag 是一个内置符号属性,它的值是一个字符串,用于表示一个对象的默认描述,也就是调用 Object.prototype.toString 会返回的内容,比如:

let obj = {}
obj[Symbol.toStringTag] = 'ABC'
console.log(Object.prototype.toString.call(obj)) // [object ABC]

对于自定义对象,调用上面的方法,都只会返回 [object Object]。此时就可以使用 Symbol.toStringTag 来指定一个确定的类型了,比如:

class Person{
    get[Symbol.toStringTag](){
        return 'Person'
    }
}
let person = new Person()

console.log(Object.prototype.toString.call(person)) // [object Person]

Object.prototype.isPrototypeOf:和 instanceof 类似

isPrototypeOf 和 instanceof 类似,都是基于原型链和原型对象去做判断的。它用来检查一个对象是否存在于另一个对象的原型链上。

function Person() {
    
}

let person = new Person()

console.log(Person.prototype.isPrototypeOf(person))

Array.isArray:专业检测数组三十年

起初以为它是 ES6 提供的新方法,后来得知其实属于 ES 5.1 规范。

看名字就知道,它是专门用于检测数组类型的,该方法的命名真实言简意赅。

Array.isArray([]) // true

Number.isNaN:完善window.isNaN

这个方法就是真的属于 ES6 标准了。

我们知道,JS 中有一个特殊的“数字” NaN,表示 not a number,不是一个数字,但它却归属于数字类型:

console.log(typeof NaN) // 'number'

NaN 用于表示不是一个数字,它不等于任何值,包括它本身。在 ES6 之前,window 对象提供了一个全局方法 isNaN,用于判断一个数字是不是 NaN:

isNaN(10) // false
isNaN('abc') // true
isNaN(NaN) // true

可以发现,isNaN 对于字符串的检测结果也是 NaN。但这其实并不严谨,它对要判断的数据做了一个隐式类型转换,先转为数字再进行判断。而NaN 的检测应该仅限于数字类型,所以 ES6 提供了 Number.isNaN 方法:

Number.isNaN(NaN) // true
Number.isNaN('123') // false

它能判断一个值是否严格等于NaN。

等比较:与固定值进行比较

直接通过与一个特定的值进行比较,从而判断数据的类型,比如:

let value = null
console.log(value === null) // true

// 同时判断一个值是 undefined 或者 null
let value
console.log(value == null) // true


总结

本文整理了 JS 中常用的判断数据类型的方法,其中 typeof 和 Object.prototype.toString 使用场景是最多的,对一些特殊的数据类型,比如 null,NaN,自定义类型,可以选择其他的方式去进行判断,做到灵活运用。

关于数据类型的检测, 如果你还有其他的方式,欢迎评论补充,一起学习。

标签:判断,console,log,object,数据类型,JS,Object,toString
From: https://blog.51cto.com/u_12382805/8985508

相关文章

  • js 把对象存入数组中
    js把对象存入数组中  varparams=[];varinfo={"张三":"21","李四":"32","王五":"14","小红":"31","小兰":"24",......
  • java爬虫(jsoup)如何设置HTTP代理ip爬数据
    前言在Java中使用Jsoup进行网络爬虫操作时,有时需要使用HTTP代理IP来爬取数据。本文将介绍如何使用Jsoup设置HTTP代理IP进行爬取,并提供相关代码示例。什么是HTTP代理IPHTTP代理IP是一种允许我们通过代理服务器访问互联网的方式。一般情况下,我们访问网站时,直接使用自己的IP地址进行通......
  • 无涯教程-Java9 - JShell(REPL)
    REPL代表"Read-Eval-PrintLoop"。使用JShell,java具有REPL函数。使用REPL,无涯教程可以对基于Java的逻辑进行编码和测试,而无需使用javac进行编译,并且可以直接查看计算输出。运行JShell打开命令提示符,然后键入jshell。$jshell|WelcometoJShell--Version9-ea|Forani......
  • json 数组查找数据的几种方式,包括模糊查找
    来源:http://www.shanhubei.com/archives/3418.html在JavaScript中,有几种常见的方式可以用来查找JSON数组中的数据。下面介绍了其中的几种方式:1.使用find()方法:find()方法用于在数组中查找满足指定条件的第一个元素,并返回该元素。它接受一个回调函数作为参数,该回调函数会......
  • fastjson2 JSONWriter.Feature介绍
    JSONWriter.Feature介绍FieldBased基于字段反序列化,如果不配置,会默认基于public的field和getter方法序列化。配置后,会基于非static的field(包括private)做反序列化。IgnoreNoneSerializable序列化忽略非Serializable类型的字段BeanToArray 将对象序列为[101,“XX”]这样的数组格......
  • 运行js文件,会弹出一个python解释器的界面,怎么解决呢?
    大家好,我是皮皮。一、前言前几天在Python白银交流群【菜......
  • JS逆向快速定位关键点之通用hook脚本
    大部分网站都会对关键参数进行加密,JS逆向时,我们首要任务是定位参数具体的加密逻辑。常见方式包含:关键字搜索、堆栈调试、XHR及事件监听、AST内存漫游、JSHook注入等本篇文章以JSHook注入为切入点,在做JS逆向往往需要定位到一些关键参数位置去分析,比如Cookie、Sign、Toke......
  • 【力扣】-1672. 最富有客户的资产总量|刷题打卡-JS
    给你一个 mxn 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。示例1:第1位客户的资产......
  • Json Schema简介和Json Schema的.net实现库 LateApexEarlySpeed.Json.Schema
    什么是JsonSchema?JsonSchema是一种声明式语言,它可以用来标识Json的结构,数据类型和数据的具体限制,它提供了描述期望Json结构的标准化方法。利用JsonSchema,你可以定义Json结构的各种规则,以便确定Json数据在各个子系统中交互传输时保持兼容和一致的格式。一般来说,系统可以自......
  • VUE3 + Three.js 坑
    VUE3+Three.js坑1.问题描述将scene、camera、renderer、controls等变量用reactive变成响应式时,页面渲染会报错:three.module.js?5a89:24471UncaughtTypeError:'get'onproxy:property'modelViewMatrix'isaread-onlyandnon-configurabledatapropertyonthe......