typeof VS instanceof

74 阅读3分钟

JavaScript中的数据类型是非常重要的。typeof和instanceof是两个重要的运算符,它们可以帮助我们确定一个值的数据类型。在这篇文章中,探讨typeof和instanceof这两个运算符的用途和差异。

typeof运算符

typeof运算符可以用来确定一个值的数据类型。它的语法如下:

typeof value

value是需要检测的值,可以是任何JavaScript类型。typeof返回一个表示值的数据类型的字符串,如下:

  • "undefined" - 如果值未定义
  • "boolean" - 如果值是布尔值
  • "number" - 如果值是数字
  • "bigint" - 如果值是大整数
  • "string" - 如果值是字符串
  • "symbol" - 如果值是符号
  • "function" - 如果值是函数
  • "object" - 如果值是对象或null

需要注意的是,typeof运算符不能识别null,它将null识别为对象。这是一个历史遗留问题,因为在JavaScript的早期版本中,null是以0x00标记的对象类型的值。在ES6中,null被定义为一个独立的原始类型,但为了兼容旧版本,typeof仍然将null识别为对象。

下面是一些使用typeof运算符的例子:

typeof undefined    // "undefined"
typeof true         // "boolean"
typeof 42           // "number"
typeof 42n          // "bigint"
typeof "hello"      // "string"
typeof Symbol()     // "symbol"
typeof function(){} // "function"
typeof null         // "object"
typeof {}           // "object"
typeof []           // "object"

instanceof运算符

instanceof运算符可以用来检查一个对象是否属于某个类。它的语法如下:

object instanceof constructor

object是要检查的对象,constructor是对象的类。instanceof返回一个布尔值,如果对象是类的实例,则返回true,否则返回false。

需要注意的是,constructor参数必须是一个函数,因为在JavaScript中,类就是由函数定义的。下面是一些使用instanceof运算符的例子:

var d = new Date();
d instanceof Date     // true
d instanceof Object   // true

var str = "hello";
str instanceof String // false,因为str是一个字符串字面量,不是String对象的实例

typeof和instanceof的差异

typeof和instanceof是两个非常不同的运算符。typeof用于确定一个值的数据类型,而instanceof用于检查一个对象是否属于某个类。需要注意的是,typeof运算符不能检测对象是否属于某个类。

另一个差异是,typeof运算符返回一个字符串,而instanceof运算符返回一个布尔值。这意味着typeof运算符返回的值不能用于条件语句,但instanceof运算符可以用于条件语句。

最后,typeof运算符可以用于任何类型的值,包括未定义的值,而instanceof运算符只能用于对象类型的值,不能用于基本类型的值。因此,如果我们想要检查一个值是否属于某个类,我们需要使用instanceof运算符,如果我们想要确定一个值的数据类型,我们需要使用typeof运算符。

下面是一些使用typeof和instanceof运算符的例子:

typeof "hello"                 // "string"
"hello" instanceof String     // false,因为"hello"是一个字符串字面量,不是String对象的实例

typeof true                    // "boolean"
true instanceof Boolean        // false,因为true是一个布尔字面量,不是Boolean对象的实例

typeof function(){}            // "function"
function(){} instanceof Object // true,因为所有函数都是对象,继承自Object类

typeof null                    // "object"
null instanceof Object         // false,因为null不是对象

结论

typeof和instanceof运算符在JavaScript中都是非常有用的工具。typeof可以帮助我们确定一个值的数据类型,而instanceof可以帮助我们检查一个对象是否属于某个类。需要注意的是,typeof运算符不能检测对象是否属于某个类,而instanceof运算符只能用于对象类型的值,不能用于基本类型的值。理解这两个运算符的区别和用途将帮助我们更好地理解JavaScript的数据类型。