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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,613评论 0 13
  • 0. 写在前面 当你开始工作时,你不是在给你自己写代码,而是为后来人写代码。 —— Nichloas C. Zak...
    康斌阅读 5,535评论 1 42
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,764评论 0 6
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,540评论 0 21
  • 一直以来我都发现一个现象,不是特别明显,就是带北北外出的时候,有别的小朋友会攻击他,比如在超市玩玩具的时候,有其他...
    禧禧橙阅读 245评论 0 0

友情链接更多精彩内容