类型判断
JS中的类型判断
typeof
note
typeof: 返回:number boolean string symbol object undefined function 之一 缺点: 1、对于基本类型,除了null以外,均可以返回正确结果,typeof null = 'object' 2、对于引用类型,除了function外,一律返回'object' typeof function() {} = 'function'
typeof ''; // string 有效 ✔
typeof 1; // number 有效 ✔
typeof Symbol(); // symbol 有效 ✔
typeof true; //boolean 有效 ✔
typeof undefined; //undefined 有效 ✔
typeof new Function(); // function 有效 ✔
typeof null; //object 无效 ❌
typeof [] ; //object 无效 ❌
typeof new Date(); //object 无效 ❌
typeof new RegExp(); //object 无效 ❌
caution
null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型,这不是理想的结果
instanceof
note
instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。 在这里需要特别注意的是:instanceof 检测的是原型
caution
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型,针对数组类型,ES5提供了Array.isArray()方法 用于确认某个对象本身是否是Array类型,而不用区分该对象在哪个环境中创建
终极大招:toString() 方法
note
toString()是Object原型上的方法,调用该方法,默认返回当前对象的[[Class]],这是一个内部属性,格式为[object Xxx], 其中 Xxx 就是对象的类型。 对于Object对象,直接调用toString()即可放回 [object Object],而对于其他对象,则需要通过call/apply来调用
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 的引用