JS 数据类型检测四种方式及各自特点
发布日期:2021-05-27 01:31:35 浏览次数:29 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Mapbox for Android遇到的小问题集合
下一篇:笔记整理-03-变量提升(预解释)之(2)-定义变量的时候带var 和不带var 的区别

发表评论

最新留言

很好
[***.229.124.182]2024年07月11日 06时40分40秒