美文网首页
01.【JS基础】数据类型的判断方法

01.【JS基础】数据类型的判断方法

作者: 唐唐_sugar | 来源:发表于2016-09-09 16:32 被阅读0次

    1.typeof方法

    此类方法适用于非object的类型判断,返回变量类型。

    var str = "abc";
    var num = 123;
    var arr = [1,2,3];
    var boolean = true;
    var obj = {a:1,b:2,c:3};
    var fn1 = function(){alert(123);};
    var date = new Date ();
    var aaa;
    var bbb = null;
    
    console.log(typeof str);       //string
    console.log(typeof num);       //number
    console.log(typeof arr);       //object
    console.log(typeof boolean);    //boolean
    console.log(typeof obj);       //object
    console.log(typeof fn1);       //function
    console.log(typeof date);       //object
    console.log(typeof aaa);       //undefined
    console.log(typeof bbb);       //object
    

    注意:

    • i. typeof 可以判断function类型的变量;
    • ii. typeof 不能判断object的具体类型(数组/对象/null/日期均返回object类型);
    • iii. 已声明但未初始化(赋值)的变量typeof返回undefined,初始化值为null的变量typeof返回object
    • iv. typeof NaN返回"number"

    2.instanceof方法——判断对象类型(基于原型链的操作符)

    此方法适用于已知变量类型为object,判断该对象的具体类型(注意大小写),返回值为布尔值。

    obj instanceof Object

    • 左操作数obj :期望值是一个对象,如果是基本类型,返回false
    • 右操作符Object : 函数对象或函数构造器, 如果不是,抛出typeerror异常
    console.log(arr instanceof Array);      //true
    console.log(fn1 instanceof Function);   //true
    console.log(date instanceof Date);      //true
    console.log(obj instanceof Object);     //true
    
    

    3.constructor方法

    类似于instanceof方法,但在继承时会出错,慎用

    console.log(arr.constructor === Array);      //true
    console.log(fn1.constructor ===  Function);   //true
    console.log(date.constructor ===  Date);      //true
    console.log(obj.constructor === Object);     //true
    

    在出现继承时:

        
    function Student () {};       //构造函数Student
    function Person () {};        //构造函数Person 
    
    Student.prototype = new Person();   //Student继承自Person
    var Jack = new Student();       //通过构造函数Student创建一个名为Jack的对象
    
    console.log(Jack.constructor === Person);       //true
    console.log(Jack.constructor === Student);      //flase
    
    //但用instanceof方法时,对象直接继承和间接继承都报true
    console.log(Jack instanceof Person);       //true
    console.log(Jack instanceof Student);      //true
    
    

    4.prototype方法(通用)

    此方法为通用方法,但较繁琐,注意大小写

    console.log(Object.prototype.toString.call(str);        //[Object String]
    console.log(Object.prototype.toString.call(num);        //[Object Number]
    console.log(Object.prototype.toString.call(fn);        //[Object Function]
    console.log(Object.prototype.toString.call(obj);        //[Object Object]
    console.log(Object.prototype.toString.call(date);        //[Object Date]
    console.log(Object.prototype.toString.call(aaa);        //[Object Undefined]
    console.log(Object.prototype.toString.call(bbb);        //[Object Null]
    console.log(Object.prototype.toString.call(arr);        //[Object Array]
    console.log(Object.prototype.toString.call(boolean);    //[Object Boolean]
    
    

    小结:

    • a. 不判断Object具体类型时:用typeof方法判断即可;
    • b. 仅判断Object具体类型时:用instanceof或constructor方法,但constructor方法在有继承的情况下会出错,尽量使用instanceof
    • c. 非Object类型与Object具体类型都要判断时:用prototype方法,注意大小写

    相关文章

      网友评论

          本文标题:01.【JS基础】数据类型的判断方法

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