本文详细解析JavaScript中typeof和instanceof两种类型检测机制的区别。typeof用于判断基本数据类型及函数,返回字符串;instanceof用于检测对象是否属于特定构造函数,依赖原型链。通过代码示例对比原始值与包装对象的行为,阐明两者在判断引用类型时的不同表现及适用场景。
typeof运算符检测基本数据类型
typeof运算符用于检测给定变量的数据类型,这通常被称为基本类型或基本数据类型。它涵盖的范围包括undefined、boolean、string、number、object以及function。例如,执行var message = "so easy";后,alert(typeof message)会返回"string";而alert(typeof 12)则返回"number"。
可以这样记忆:typeof主要用于判断那些没有通过new关键字创建的普通变量。
instanceof检测引用类型与原型链
instanceof运算符用于检测对象的具体类型,这里指的是引用类型,包括Object、Array、Date、RegExp、Function以及基本包装类型(如Boolean、Number、String)。通过示例var numberObject = new Number(10);和var numberValue = 10;可以看出,alert(typeof numberObject)返回"object",而alert(typeof numberValue)返回"number"。进一步使用alert(numberObject instanceof Number)会返回true,而alert(numberValue instanceof Number)返回false。这是因为numberValue属于number基础数据类型,不属于任何引用类型;而numberObject虽然基础类型为object,但它属于Number引用类型,且所有引用类型都从Object引用类型继承而来。
可以这样记忆:instanceof检测的都是通过new关键字创建的“对象”。而没有通过new创建出来的“变量”不属于任何一个引用类型。如果使用typeof来检测通过new创建的“对象”,其结果始终返回“object引用类型”。
isPrototypeOf()方法用于检测原型和实例之间的关系,instanceof同样可以实现这一功能。只要某个原型出现在原型链中,它就可以被认为是该原型链所派生实例的原型。例如,定义var person = new Person();(假设Person继承自Object),alert(Person.prototype.isPrototypeOf(person))返回true,alert(Object.prototype.isPrototypeOf(person))也返回true。