instanceof 与 typeof

87 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情

前言:

成功没有捷径但成长有路径

老概念新理解,重点记录一下

正文

背景

我们经常会用到判断类型,前端有几种形式,instanceof和typeof 都是用来判断类型的,他们两个什么区别,什么情况用instanceof,什么情况用typeof,其中的细节还是需要注意区分的,彻底掌握。

typeof

typeof 可以是任何类型,返回一个字符串,说明操作数的类型 举例说明

typeof '你好'; // string 
typeof 123; // number 
typeof true; // boolean 
typeof undefined; // undefined 

typeof 仅可以返回类型 undefined、string、symbol、object、function、number、boolean、bigint。

注意typeof 有局限性(Array, Null 等特殊对象): 1,typeof区分不了数组跟对象, 2,不包含null,null是特殊值,被认为是一个对空对象的引用(无法判断出引用数据类型的统统返回 object)。

typeof []; // object 
typeof {}; // object

typeof null; // object

instanceof

typeof可以帮我们判断简单类型,但是他有些无法区分的类型(引用),就会都被当成object处理。所以如果想准确判断这部分类型,可以用 instanceof 运算符,返回一个布尔值。

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。 举例说明

object instanceof constructor

原理就是顺着原型链去找,直到找到相同的原型对象,出现过就是true,否则false

总结

通过比较typeof和instanceof,理解他们的使用和原理

不同点:typeof和instanceof的区别是,typeof的返回值是一个字符串,字符串会表示变量的数据类型;instanceof的返回值是布尔值,用于判断是否属于对象上的实例。

这两个各有弊端,instanceof可以针对复杂引用数据类型,typeof针对基础数据类型。通用的检测数据类型可以使用Object.prototype.toString,返回“[object Xxx]”的字符串

Object.prototype.toString.call(1)
'[object Number]'
Object.prototype.toString.call('1')
'[object String]'
Object.prototype.toString.call([])
'[object Array]'
Object.prototype.toString.call({})
'[object Object]'