对typeof 和 instanceof 的理解

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解决。

你可能感兴趣的:(对typeof 和 instanceof 的理解)