JavaScript篇 -- 判断变量类型(typeof、toString、instanceof)

typeof

typeof运算符会返回一个字符串表示变量的类型。
主要用来判断 基本类型变量和对象。

typeof "Hello world"; // string
typeof 123;           // number
typeof true;          // boolean
typeof undefined;     // undefined
typeof null;          // object
typeof {a:1};         // object
typeof function(){}   // function

说明:
typeof是根据变量的二进制数据前三位来表示类型的。
'000'表示object类型,而null的二进制数据全为0,所以typeof会把null判断为object类型。

Object.prototype.toString.call()

toString()会返回一个表示该对象的字符串(包含对象子类型信息)。
可以用来判断内嵌对象子类型和基本类型变量。

let toString = Object.prototype.toString;

toString.call([]);            // '[object Array]'
toString.call(new Date);      // '[object Date]'
toString.call(function(){});  // '[object Function]'

toString.call(123);           // '[object Number]'
toString.call("Hello");       // '[object String]'

toString.call(undefined);     // '[object Undefined]'
toString.call(null);          // '[object Null]'
toString.call(true);          // '[object Boolean]'

说明:

  • Object原型的toString方法会被对象"继承",同时也有可能被"覆盖",所以这里调用的是Object原型的方法,而不是对象本身的方法。
  • toString返回的是对象内部属性[[Class]]的值,所以该方法无法判断自定义构造函数创建的对象类型。
function Foo(){}
let foo = new Foo();
Object.prototype.toString.call(foo);  // [object Object]

instanceof

instanceof运算符 用来判断 一个对象是否是某个构造函数的实例。

[] instanceof Array;         // true
new Date() instanceof Date;  // true
let foo = new Foo();
foo instanceof Foo;          // true
1 instanceof Number;         // false

说明:

/**
 * instanceof用于判断一个对象是否是某个构造函数的实例。
 * 原理:检查构造函数的prototype原型对象是否在对象的原型链上。
 */
function instanceof(obj,func){
    let prototype = func.prototype;
    let proto = Object.getPrototypeOf(obj);
    while(proto){
        if(prototype == proto){
            return true;
        }
        proto = Object.getPrototypeOf(proto);
    }
    return false;
}

总结

  1. 优先使用Object.prototype.toString.call(),可用于准确判断内置对象子类型和基本类型变量。
  2. typeof可用于区分对象类型和基本类型。
  3. instanceof可用于判断自定义构造函数的实例对象。
上一篇:26Object类的toString方法(应用)


下一篇:js实现自定义格式化时间