美文网首页
JavaScript数据类型检测

JavaScript数据类型检测

作者: 感觉不错哦 | 来源:发表于2018-12-20 09:57 被阅读23次
    先列举一下JavaScript中的基本数据类型

    1、基本数据类型(6种)

    Undefined
    Null
    Boolean
    Number
    String
    Symbol  (ES6新增) 符号类型

    2、引用数据类型: Object

    typeof基本数据类型检测

    我们常说typeof是基本数据类型检测,因为typeof无法检测引用数据类型,所有的引用类型都返回Object
    在实际运用中,typeof的实际场景往往是用来检测一个对象是否被定义或者赋值,而不是用来检测数据类型

    var a,b=10,c='',d={}
    alert(typeof a) //undefined
    alert(typeof b) //number
    alert(typeof c) //string
    alert(typeof d) //object
    

    需要注意的是 typeof 返回的是字符串

    alert(typeof typeof d) //string
    

    instanceof引用数据类型检测

    instanceof 左操作数是一个类,右操作数是标识对象的类。如果左侧的对象是右侧类的实例,则返回true.而js中对象的类是通过初始化它们的构造函数来定义的。即instanceof的右操作数应当是一个函数。所有的对象都是object的实例。如果左操作数不是对象,则返回false,如果右操作数不是函数,则抛出typeError。简单来讲instanceof 运算符用来检测constructor.prototype 是否存在于参数 object 的原型链上

     var arr=[1,2,3]
     var obj={a:1}
     var reg=/\d+/
     console.log(arr instanceof Array,obj instanceof Object,reg instanceof RegExp) //true true true
    

    只对引用类型有效

     var a=10
     console.log(a instanceof Number) //false
    

    稍微扩展一下用法,不深入

            // 定义构造函数
            function C(){} 
            function D(){} 
    
            var o = new C();
    
            o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
    
            o instanceof D; // false,因为 D.prototype不在o的原型链上
    
            o instanceof Object; // true,因为Object.prototype.isPrototypeOf(o)返回true
            C.prototype instanceof Object // true,同上
    
            C.prototype = {};
            var o2 = new C();
    
            o2 instanceof C; // true
    
            o instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.
    
            D.prototype = new C(); // 继承
            var o3 = new D();
            o3 instanceof D; // true
            o3 instanceof C; // true 因为C.prototype现在在o3的原型链上
    

    就一个要素,看原型链 左边的是否在右边的原型链上

    看过我之前文章的小伙伴可能会理解下面为什么?如果看不懂没关系,一般用不上。Object._proto_=>null 也可以理解这里没有null

            function Person() {}
            console.log(Object instanceof Object);     //true
            //第一个Object的原型链:Object=>
            //Object.__proto__ => Function.prototype=>Function.prototype.__proto__=>Object.prototype
            //第二个Object的原型:Object=> Object.prototype
    
            console.log(Function instanceof Function); //true
            //第一个Function的原型链:Function=>Function.__proto__ => Function.prototype
            //第二个Function的原型:Function=>Function.prototype
    
            console.log(Function instanceof Object);   //true
            //Function=>
            //Function.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
            //Object => Object.prototype
    
            console.log(Person instanceof Function);      //true
            //Person=>Person.__proto__=>Function.prototype
            //Function=>Function.prototype
    
            console.log(String instanceof String);   //false
            //第一个String的原型链:String=>
            //String.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
            //第二个String的原型链:String=>String.prototype
    
            console.log(Boolean instanceof Boolean); //false
            //第一个Boolean的原型链:Boolean=>
            //Boolean.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
            //第二个Boolean的原型链:Boolean=>Boolean.prototype
    
            console.log(Person instanceof Person); //false
            //第一个Person的原型链:Person=>
            //Person.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
            //第二个Person的原型链:Person=>Person.prototype
    

    [[class]]类属性

    之前我在对象深入中介绍过此属性,看过的小伙伴不知道还有没有印象

    对象的类属性是个字符串,用来表示对象的类型信息,然而ES3与ES5都未设置这个属性的方法,有一种间接的方法可以查询到它

         function classof(obj){
            
            return Object.prototype.toString.call(obj)
        }
        console.log(classof(null)) //Null
        console.log(classof(1)) //Number
        console.log(classof("")) //String
        console.log(classof(false)) //Boolean
        console.log(classof(/./))  //RegExp
        console.log(classof(undefined))  //Undefined
    

    此方法是最好的判断方法

    相关文章

      网友评论

          本文标题:JavaScript数据类型检测

          本文链接:https://www.haomeiwen.com/subject/xnfqkqtx.html