在js中用来检测数据类型的四种方式
1.typeof
2.instanceof
3.constructor
4.Object.prototype.toString.call()
Array.isArray 检测是否为一个数组
一、typeof 详解
- 特点1 返回结果首先是一个字符串,其次字符串中包含了对应的数据类型
- ‘number’
- ‘string’
- ‘boolean’
- ‘undefined’
- ‘object’
- ‘function’
- ‘bigint’
- 特点2:按照计算机底层存储的二进制进行检测 检测性能高
- 原理:按照二进制值检测 {000:对象 1:整数 010:浮点数 100:字符串 110:布尔 undefined:-2^30 null:全是零}
- 特点3:typeof null -> “object”
- 特点4 :typeof 不能细分对象
- typeof 函数 ->”function” 「可以调用call方法,可执行」
- 特点5:基于typeof检测一个未被声明的变量,不会报错,结果是“undefined” => 你可以理解为这是浏览器的一个BUG「暂时性死区」
- 用于插件封装中的暴露API
- 用于插件封装中的暴露API
注意:
检测对象类型 只有funciton是function 其他的对象类型(数组array、正则、普通对象)都是”object” ,所以用typeof 检测的话,并不能细分。
问题:typeof null=>”object” typeof {name:’曹亚倩’}为什么也等于 “object” 因为是根据二进制检测 null和对象的前三位相同
typeof function 为什么能检测出 “function” 因为function检验对象的时候先判断是不是调用call方法
typeof "zhufeng" ====》"string"
typeof 12 ===> "number"
typeof false ===>"boolean"
typeof true ====> "boolean"
typeof null ====> "object"
typeof undefined ====>"undefined"
typeof Symbol()=>"symbol"
typeof 456n=>"bigint"
//引用数据类型,除了function,typeof检测是function,其余检测返回的都是“object”
typeof [1,2] =====>"object"
typeof function(){} =>"function"
*当typeof 超过两个写的时候 返回值都是字符串string
typeof []===>"object"
typeof typeof []===>"string"
二、instanceof
- 1、定义:用来检测某个实例是否属于这个类
- 当前类的原型只要出现在了实例的原型链上就返回
true
- 当前类的原型只要出现在了实例的原型链上就返回
- 2、语法:
实例 instanceof 类
- 3、属于返回
TRUE
,不属于返回FALSE
4、优点:
- 基于这种方式,可以弥补
typeof
无法细分对象类型的缺点(想检测这个值是否为数组,只需要看他是否为Array类的实例即可)let arr = [10, 20]; console.log(typeof arr); //=>"object" console.log(arr instanceof Array); //=>true console.log(arr instanceof RegExp); //=>false console.log(arr instanceof Object); //=>true 不管是数组对象还是正则对象,都是Object的实例,检测结果都是TRUE,所以无法基于这个结果判断是否为普通对象
- 基于这种方式,可以弥补
5、局限性:
- 1)、要求检测的实例必须是对象数据类型的
- 2)、基本数据类型的实例是无法基于它检测出来的
- 字面量方式创建的不能检测
- 构造函数创建的就可以检测
- 3)、不管是数组对象韩式正则对象,都是 Object 的实例,检测结果都是 TRUE ,所以无法基于这个结果判断是否为普通对象
注意️:它本身不能完成数据类型检测,只是利用它(检测某个实例属否属于这个类的)特征来完成数据检测// instanceof检测的实例必须都是引用数据类型的,它对基本数据类型值操作无效 console.log(10 instanceof Number); //=>false console.log(new Number(10) instanceof Number); //=>true // instanceof检测机制:验证当前类的原型prototype是否会出现在实例的原型链__proto__上,只要在它的原型链上,则结果都为TRUE function Fn() {} Fn.prototype = Object.create(Array.prototype); let f = new Fn; console.log(f instanceof Array); //=>true f其实不是数组,因为它连数组的基本结构都是不具备的 复制代码