题解 | #检测复杂数据类型#
检测复杂数据类型
https://www.nowcoder.com/practice/adb772f07443470483d7ca0a8f939e38
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style> /* 填写样式 */ </style> </head> <body> <!-- 填写标签 --> <script type="text/javascript"> // 填写JavaScript function _instanceof(left,right) { return left instanceof right } </script> </body> </html>
instanceof
是 JavaScript 中的一个二元运算符,用于检查一个对象是否是某个构造函数的实例。它主要用于确定对象的类型和继承关系。
基本语法
javascript深色版本1object instanceof constructor
object
是你要检查的对象。constructor
是你想要验证的对象的构造函数。
工作原理
instanceof
运算符的工作原理如下:
- 原型链检查:
instanceof
检查对象的原型链 (__proto__
) 是否包含构造函数的原型 (prototype
)。 - 原型指向:每个构造函数都有一个
prototype
属性,该属性指向一个对象,该对象描述了由该构造函数创建的所有实例所共享的属性和方法。 - 原型链遍历:
instanceof
会沿着对象的原型链向上查找,直到找到与构造函数原型相匹配的原型,或者到达原型链的顶端(即null
)。
示例
假设我们有两个构造函数 Person
和 Student
,其中 Student
继承自 Person
:
javascript深色版本1function Person(name) { 2 this.name = name; 3} 4 5function Student(name, grade) { 6 Person.call(this, name); 7 this.grade = grade; 8} 9 10// 设置继承关系 11Student.prototype = Object.create(Person.prototype); 12Student.prototype.constructor = Student; 13 14const john = new Person('John'); 15const alice = new Student('Alice', 12); 16 17console.log(john instanceof Person); // true 18console.log(alice instanceof Student); // true 19console.log(alice instanceof Person); // true 20console.log(john instanceof Student); // false
特殊情况
- 原型属性未设置:如果构造函数没有显式设置
prototype
属性,那么它的prototype
默认为Object.prototype
。 - 原型属性丢失:如果构造函数的
prototype
被设置为null
,那么instanceof
将始终返回false
。 - 跨域对象:如果对象是在一个不同的执行上下文中创建的(例如来自另一个窗口或框架),那么
instanceof
可能会返回错误的结果,因为原型链不在同一个环境中。
使用场景
- 类型检查:用于确定一个对象是否是特定构造函数的实例。
- 继承检查:用于确认一个对象是否继承自另一个构造函数。
注意事项
instanceof
不适用于原始类型(如number
、string
和boolean
)。对于原始类型的包装器对象,instanceof
仍然有效。instanceof
可以用来检测数组和函数,因为它们也是对象。
示例代码
javascript深色版本1const num = 42; 2console.log(num instanceof Number); // false,因为 42 是原始类型的 number 3 4const numObj = new Number(42); 5console.log(numObj instanceof Number); // true