JavaScript 中 typeof 和 instanceof 常用来做类型检测。
首先来看看typeof,typeof操作符返回一个字符串,表示未经计算的操作数的类型。
我们先来看下几种常见类型的检测结果:
Undefined ===================》"undefined"
Null ===================》"object"(见下文描述)
Boolean ===================》"boolean"
Number ===================》"number"
String ===================》"string"
Symbol (ECMAScript 6 新增)===================》 "symbol"
函数对象===================》 "function"
任何其他对象 ===================》"object"
我们先来看下几种特殊情况:
typeof NaN === 'number' // true
typeof null === 'object' // true
{
typeof obj // uncaught error
let obj = {};
}
typeof [] === 'object' // true
要注意下上面的3种情况:
1、NaN虽然代表not a number,但是typeof检测的结果依旧是'number'。可用isNaN方法区分;
2、null虽然是一种基本类型,但是检测出来类型却是"object",无法专门做区分;
3、ES6中的let/const在块中,存在临时死区概念,所以,这种情况下,typeof也并不是100%安全。
4、数组类型无法通过typeof检测出来,可以通过Array.isArray([])解决
接下来,看看instanceof,它主要用来干嘛呢?
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
function A(){
}
function B(){
}
var a = new A();
a instanceof A; // true
var s = 'hello'
s instanceof String // false,直接字面量检测不出来
var ss=new String('1')
ss instanceof String // true
var arr = [];
arr instance of Array // true
几种特殊情况说明:
1、谨记instanceof检测符是根据构造函数的prototye是否在被检测对象的原型链中来确定结果的。
2、数组对象的检测,在跨iframe的时候使用instance检测会出现问题,因为彼此的prototype对象并不会共享。这时候可以通过isArray解决。如果是ie8及以下浏览器可以通过Object.prototype.toString.call(myObj) === "[object Array]"来解决。
3、关于上面提到的null的检测,可自己实现一个工具函数检测:
function isnull(n){
if(!n && typeof n == 'object' ){
return true
}
return false
}
总结:
1、常用的基础类型:number\strting\function\undefined可以放心使用typeof检测;
2、对于NaN可用isNaN来检测,对于null的检测,可自己写个工具函数解决;
3、对于数组的检测,用isArray最为稳妥,低于ie9需要使用Polyfill解决。
网友评论