
JS 数据类型检测四种方式及各自特点
发布日期:2021-05-27 01:31:35
浏览次数:8
分类:技术文章
本文共 2444 字,大约阅读时间需要 8 分钟。
方式一 typeof
- 特点:
- 直接在计算机底层基于数据类型的值(二进制)进行检测,检测数据类型返回的结果是个字符串;
- typeof null 的结果是"object",因为对象存储在计算机中,都是以000开始的二进制存储,null也是000开始的二进制存储,所以输出的结果也是对象;
- typeof 检测 数值对象/正则对象/日期对象 结果都是"object",无法确定具体是什么对象;
- typeof 对null 和对象不好用,对其他的都好用;
- bigint 的检测方式 ,在要检测的数据后+n ,如 typeof 1n ==>“bigint”;
方式二 instancecf 检测当前实例是否属于这个类的
- 特点:
- 底层机制:只要当前类出现在实例的原型上,结果都是true ,即 实例.proto === 类.prototype(手写实现)
- 由于可以肆意修改原型的指向,所以检测出来的结果是不准确的
- 不能检测基本类型
方式三 constructor
- 用起来看似比instanceof 好用(基本类型和引用类型都支持的)
let arr = []; console.log(arr.constructor === Array); //true console.log(arr.constructor === RegExp); //false console.log(arr.constructor === Object); //false
- constructor 可以随便改,所以也不准
let n = 1; console.log(n.constructor === Number); //true // 修改Numbe类的原型的constructor = "AAbbc" Number.prototype.constructor = 'AAbbc'; console.log(n.constructor === Number); //false
- constructor在数组的深拷贝与浅拷贝中常用到(用constructor来判断要拷贝的数据之前是什么类型,然后创建一个类型相同的),具体用法查一下
方式四 Object.prototype.toString.call([value])
-
标准检测数据类型的方法,Object.prototype.toString不是用来转换字符串的,而是返回当前实例所属类的信息
-
标准检测方法 返回的结果是:
“[object Number/String/Boolean/Null/Undefined/Symbol/Object/Array/RegExp/Date/Function]”let obj = { name: '喵喵', } // obj.toString() obj通过原型链找到Object原型上的toString方法,把toString方法执行 // toString方法执行,this是obj,所以检测的是obj所属类的信息 // 推测:是不是只要把Object.prototype.toString执行,让它里面的this变为检测的值,那就能返回当前值所属类的信息? //借鉴jquery 源码 ~(function () { var class2type = { }; var toString = class2type.toString; // Object.prototype.toString // 设定数据类型的映射表 [ 'Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Object', 'Error', 'Symbol', ].forEach((name) => { class2type[`[object ${ name}]`] = name.toLowerCase(); }) console.log(class2type) /*[object Array]: "array", [object Boolean]: "boolean", [object Date]: "date", [object Error]: "error", [object Function]: "function", [object Number]: "number", [object Object]: "object", [object RegExp]: "regexp", [object String]: "string", [object Symbol]: "symbol"*/ function toType(obj) { if (obj == null) { // 传递的值是null 或undefined,就返回对应的字符串 return obj + '' } // 基本数据类型都是采用typeof检测 return typeof obj === 'object' || typeof obj === 'function' ? class2type[toString.call(obj)] || 'object' : typeof obj; } window.toType = toType; //挂载到window,外面就可以用了 })()
转载地址:https://blog.csdn.net/hxm2017jy/article/details/117226898 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2023年11月21日 08时28分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
AcWing 55 连续子数组的最大和
2019-03-25
AcWing 56 从1到n整数中1出现的次数
2019-03-25
AcWing 57 数字序列中某一位的数字
2019-03-25
AcWing 58 把数组排成最小的数
2019-03-25
AcWing 59 把数字翻译成字符串
2019-03-25
AcWing 60 礼物的最大价值
2019-03-25
AcWing 61 最长不含重复字符的子字符串
2019-03-25
AcWing 62 丑数
2019-03-25
AcWing 63 字符串中第一个只出现一次的字符
2019-03-25
AcWing 64 字符流中第一个只出现一次的字符
2021-05-28
AcWing 65 数组中的逆序对
2021-05-28
AcWing 66 两个链表的第一个公共结点
2021-05-28
AcWing 71 二叉树的深度
2021-05-28
AcWing 83 股票的最大利润
2021-05-28
AcWing 84 求1+2+…+n
2021-05-28
AcWing 85 不用加减乘除做加法
2019-03-25
AcWing 86 构建乘积数组
2019-03-25
AcWing 87 把字符串转换成整数
2019-03-25
《剑指offer》刷题总结
2019-03-25
AcWing 105 七夕祭
2019-03-25