网站首页 > 技术文章 正文
回顾一下js中数据类型分为两大类,基础类型和引用数据类型,主要有:
基本数据类型
- Number
- String
- Boolean
- Null
- Undefined
- Symbol
复杂数据类型
- Array
- Function
- Object
检测js中的数据类型常用的方法有:
- typeof
- instanceof
- Object.prototype.toString
对比一下这三种方法的优缺点:
typeof方法
typeof 5 // number 有效
typeof 'dsd' // string 有效
typeof true // boolean 有效
typeof undefined // undefined 有效
typeof function(){} // function 有效
typeof null // object 无效
typeof [] // object 无效
typeof {} // object 无效
从以上例子中可以看到:
- typeof 用来检测基本数据类型,除了Null无效外,其他都能返回正确的结果;
- 但引用类型,除了function外,其他引用类型一律都返回object结果。
Note:这在需要对数据结构进行详细划分的时候就不适用,比如说你要明确区分数组和对象,然后进行处理的时候,typeof就完全达不到效果
好处:检测快捷方便
坏处:不能检测更为准确的数据类型,如Array、Object、Null
instanceof
MDN: 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
[] instanceof Array; // true
{} instanceof Object; // true
newDate() instanceof Date; // true
function Person(){};
newPerson() instanceof Person; // true
[] instanceof Object; // true
newDate() instanceof Object; // true
newPerson instanceof Object; // true
由上面例子可以看出:
- instanceof确实可以检测部分引用数据类型
- []是Array的实例,也是Object的实例
模拟instanceof的检测过程
instanceof (A, B) = {
var L = A.__proto__;
var R = B.prototype;
if(L === R) {
return true; // A的内部属性 __proto__ 指向 B 的原型对象
}
return false;
}
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。
由此可见instanceof在有些场景下依然不能满足检测具体类型的需求。
toString
toString是Object的原型方法。调用该方法默认返回当前对象的[[class]]
这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
Object.prototype.toString.call(5) // "[object Number]"
Object.prototype.toString.call('str') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call({}) // "[object Object]"
由上可见toString检测各数据类型算非常准确了,基本上覆盖了我们常用的数据类型
所以是判断数据类型最常用的方法。
这里利用toString写一个检测数据类型的方法
function checkDataType(value) {
const typeObj = Object.prototype.toString.call(value)
return typeObj.slice(8, -1)
}
同时,Array对象提供isArray方法来检测数据是否为数组对象
Array.isArray([1,2,4]) // true
Array.isArray({foo: 'abc'}) // false
该方法用来检测数组类型也是非常方便的。
喜欢的话,公众号记得关注哦,不定时更新前端小技巧哦!!
猜你喜欢
- 2024-11-10 趣谈JS二进制:File、Blob、FileReader、ArrayBuffer、Base64
- 2024-11-10 当裸辞遇到了面试难,你需要了解一下这些面试题
- 2024-11-10 JavaScript -- Map vs ForEach javascript map vs foreach
- 2024-11-10 面试官:请说下Object和Map的区别,Map的时间复杂度是多少
- 2024-11-10 从小白到专家:JavaScript 延展操作符的几个基本用法
- 2024-11-10 JavaScript slice()方法用法简介 js中slice函数
- 2024-11-10 《你不知道的 Blob》番外篇 你不知道 小说
- 2024-11-10 JS函数式编程工具:数组reduce方法的运用
- 2024-11-10 「前端知乎系列」ArrayBuffer 和 Blob 对象
- 2024-11-10 JavaScript 数组操作方法大全 js数组的用法
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-