请比较 JavaScript 中 typeof 运算符与 instanceof 运算符的用途与行为差异。
考察说明
考查对 JavaScript 类型检测机制的掌握程度,以及区分原始类型与引用类型检测的能力。
回答思路
- 【回答框架 1】typeof 用于检测变量的数据类型,返回一个表示类型的字符串,如 'string'、'number'、'boolean'、'undefined'、'function'、'object' 等。它对原始类型(除 null 外)检测准确,但对 null 会返回 'object',这是一个历史遗留 bug。
- 【回答框架 2】instanceof 用于检测对象是否属于某个构造函数的实例,它检查对象的原型链上是否存在该构造函数的 prototype 对象。例如,[] instanceof Array 返回 true。它主要用于引用类型(对象、数组、函数等)的检测,但无法用于原始类型。
- 【回答框架 3】二者适用的场景不同:typeof 适合检测原始类型和函数,instanceof 适合检测自定义对象类型及其继承关系。在检测数组时,typeof 会返回 'object',因此需要借助 Array.isArray() 或 instanceof Array 来准确判断。
- 【回答框架 4】在使用 instanceof 时,需要注意跨窗口或跨 iframe 的问题,因为全局对象可能不同,导致 instanceof 结果不准确。此外,原始类型(如数字、字符串)不能直接使用 instanceof,需要通过包装对象或使用 Object.prototype.toString 等方法。
- 【关键点 1】typeof 返回类型字符串,对原始类型有效,但 null 返回 'object'。
- 【关键点 2】instanceof 检查原型链,适用于引用类型,不能用于原始类型。
- 【关键点 3】typeof 适合检测函数和原始类型,instanceof 适合检测对象类型和继承关系。
- 【关键点 4】检测数组时,typeof 不够用,可使用 Array.isArray() 或 instanceof。
- 【关键点 5】跨窗口环境下 instanceof 可能失效。
- 【易错点 1】把 typeof null === 'object' 当作 null 的类型,需注意区分。
- 【易错点 2】对原始类型直接使用 instanceof,如 'str' instanceof String 会返回 false。
- 【易错点 3】跨 iframe 时,instanceof 可能因全局对象不同而误判。