js中判断一个类型大体上有四种常用的方式

  • typeof
  • constructor
  • instanceof
  • object.property.toString.call

    typeof

    1. typeof ''; // string 有效
    2. typeof 1; // number 有效
    3. typeof Symbol(); // symbol 有效
    4. typeof BigInt(9007199254740991)//'bigint' 有效
    5. typeof true; //boolean 有效
    6. typeof undefined; //undefined 有效
    7. typeof new Function(); // function 有效
    8. typeof null; //object 无效
    9. typeof [] ; //object 无效
    10. typeof new Date(); //object 无效
    11. typeof new RegExp(); //object 无效
    对于基本类型,除 null 以外,均可以返回正确的结果。对于引用类型,除 function 以外,一律返回 object 类型

    constructor

    constructor 是用于标识对象类型的,效果等同于instanceof 不过一般认为instanceof 是更可靠的方式,如下:
    1. function Person() {}
    2. Person.prototype = {
    3. name: "Nicholas",
    4. age: 29,
    5. job: "Software Engineer",
    6. sayName() {
    7. console.log(this.name);
    8. }
    9. };
    10. const friend = new Person()
    11. //当原型对象被重写后,constructor就不能指向正确的构造函数
    12. friend instanceof Person //true
    13. friend.constructor === Person//false
    14. friend.constructor === Object //true 指向了一个新的object
    虽然,原型有被重写的可能,但我们任然可以通过constructor 来判断对象类型,null和undefined不能通过此种方式来判断 ```javascript ‘’.constructor === String//true Number(1).constructor === Number//true true.constructor === Boolean//true Symbol().constructor === Symbol//true BigInt(9007199254740991).constructor === BigInt//true

new Function().constructor === Function//true new Date().constructor === Date //true [].constructor === Array//true new Error().constructor === Error//true new RegExp().constructor === RegExp

  1. <a name="mIZGX"></a>
  2. ### instanceof
  3. 用于判断一个实例是否属于某种类型。语法是 `_object_ instanceof _constructor_`_ _
  4. ```javascript
  5. [] instanceof Array //true
  6. new Date() instanceof Date //true
  7. new RegExp() instanceof RegExp //true
  8. new Error() instanceof Error //true
  9. function Person(){};
  10. new Person() instanceof Person; //true
  11. //检查的是原型链 ,所以下面的也是true
  12. [] instanceof Object; // true
  13. new Date() instanceof Object;// true
  14. new Person instanceof Object;// true

instanceof是更可靠的用来识别对象类型的方式。它能正确的辨别内置的引用类型和自定义类型

Object.prototype.toString.call

对于 Object 对象,直接调用 toString() 就能返回 [object Object]。
这种方式是最全面的,能同时判断引用类型和基本数据类型和null/undefined这种特殊的类型

aa = {a:2,b:3}
aa.toString()//'[object Object]'
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 global] window 是全局对象 global 的引用