js判断数据类型的方法

typeof

返回的结果用该类型的字符串(全小写字母)形式表示

1
2
3
4
5
6
7
8
9
10
typeof ''; // string 有效
typeof 1; // number 有效
typeof Symbol(); // symbol 有效
typeof true; //boolean 有效
typeof undefined; //undefined 有效
typeof null; //object 无效
typeof [] ; //object 无效
typeof new Function(); // function 有效
typeof new Date(); //object 无效
typeof new RegExp(); //object 无效

  • 对于基本类型,除null以外,均可以返回正确的结果
  • 对于引用类型,除function以外,一律返回object
  • 对于null,返回object
  • 对于function,返回function类型

    instanceof

    A instance B 用来判断A是否为B的实例,instanceof 检测的是原型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    var O = R.prototype;// 取 R 的显示原型
    L = L.__proto__;// 取 L 的隐式原型
    while (true) {
    if (L === null)
    return false;
    if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
    return true;
    L = L.__proto__;
    }

    [] instanceof Array; // true
    {} instanceof Object;// true
    new Date() instanceof Date;// true

    function Person(){};
    new Person() instanceof Person;

    [] instanceof Object; // true
    new Date() instanceof Object;// true
    new Person instanceof Object;// true
  • instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

  • 当一个页面不止一个全局执行环境时(存在多个iframe),不同环境之前的数据类型使用instanceof判断有问题

    1
    2
    3
    4
    5
    var iframe = document.createElement('iframe');
    document.body.appendChild(iframe);
    xArray = window.frames[0].Array;
    var arr = new xArray(1,2,3); // [1,2,3]
    arr instanceof Array; // false

    针对数组的这个问题,可以根据Array.isArray()判断

    constructor

    1
    2
    3
    function F(){}
    var f = new F()
    F.prototype.constructor === f.constructor
  • 原则上实例的constuctor属性就代表了数据类型,但是如果重写prototypez之后,就会有问题

    toString

    toString是Object原型的方法,调用该方法会返回当前对象的[[Class]],这是一个内部属性,格式为[object Xxx],Xxx就是数据的类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Object.prototype.toString.call('') ;   // [object String]
    Object.prototype.toString.call(1) ; // [object Number]
    Object.prototype.toString.call(true) ; // [object Boolean]
    Object.prototype.toString.call(Symbol()); //[object Symbol]
    Object.prototype.toString.call(undefined) ; // [object Undefined]
    Object.prototype.toString.call(null) ; // [object Null]
    Object.prototype.toString.call(new Function()) ; // [object Function]
    Object.prototype.toString.call(new Date()) ; // [object Date]
    Object.prototype.toString.call([]) ; // [object Array]
    Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
    Object.prototype.toString.call(new Error()) ; // [object Error]
    Object.prototype.toString.call(document) ; // [object HTMLDocument]
    Object.prototype.toString.call(window) ; //[object Window] window 是全局对象 global 的引用