在 JavaScript 中,有三个常用的关键字:typeof、instanceof和constructor。它们通常用于判断变量类型或对象的原型链。虽然它们在某些情况下可以互换使用,但它们之间还是有着一些重要的区别。
typeof
typeof 操作符用于确定变量或表达式的数据类型。它返回一个字符串,该字符串指示其操作数的数据类型。以下是 typeof 操作符可能返回的字符串值:
- "undefined":如果变量没有被初始化或者未声明。
- "boolean":如果变量是布尔值。
- "string":如果变量是字符串。
- "number":如果变量是数字。
- "object":如果变量是对象或 null(null 被视为对象的特殊情况)。
- "function":如果变量是函数。
以下是一个使用 typeof 操作符的例子:
let a = 42; let b = "Hello, world!"; let c = true; console.log(typeof a); // "number" console.log(typeof b); // "string" console.log(typeof c); // "boolean"
需要注意的是,typeof 返回的结果是一个字符串,因此进行类型比较时要使用字符串比较而不是直接比较类型本身。
instanceof
instanceof 运算符用于检查对象是否属于某个类(或构造函数)的实例。它返回一个布尔值,表示该对象是否属于指定的类。以下是 instanceof 运算符的语法:
object instanceof constructor
其中,object 是要检查的对象,constructor 是要比较的类(或构造函数)。
以下是一个使用 instanceof 运算符的例子:
class MyClass {}; let obj = new MyClass(); console.log(obj instanceof MyClass); // true console.log(obj instanceof Object); // true console.log(obj instanceof Array); // false
需要注意的是,instanceof 操作符检查的是原型链中是否出现了指定的类(或构造函数)。因此,如果对象是通过继承创建的,实例化时所用的构造函数与对象原型链中的构造函数可能并不相同。在这种情况下,instanceof 操作符可能会返回 false。
constructor
constructor 属性是 JavaScript 中每个对象都具有的属性,它指向对象的构造函数。如果对象是使用原型继承创建的,则该属性指向父类的构造函数。
以下是一个使用 constructor 属性的例子:
class MyClass {}; let obj = new MyClass(); console.log(obj.constructor === MyClass); // true console.log(obj.constructor === Object); // false console.log(obj.constructor === Array); // false
需要注意的是,constructor 属性可以被重写。因此,在使用 constructor 属性时应该谨慎,以避免产生意外的行为。
区别总结
- typeof 用于确定变量或表达式的数据类型,返回一个字符串。instanceof 用于检查对象是否属于某个类的实例,返回一个布尔值。constructor 用于获取对象的构造函数。
- typeof 适用于基本数据类型和函数,但不适用于 null 和对象字面量。instanceof 适用于对象,但不适用于基本数据类型和函数。constructor 对所有对象都适用。
- instanceof 检查的是原型链中是否出现了指定的类(或构造函数)。因此,如果对象是通过继承创建的,实例化时所用的构造函数与对象原型链中的构造函数可能并不相同。
- constructor 属性可以被重写。因此,在使用 constructor 属性时应该谨慎,以避免产生意外的行为。
学习和指导意义
typeof、instanceof 和 constructor 是 JavaScript 中非常常用的关键字。了解它们的区别和用法,对于理解 JavaScript
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/219