题解 | #检测复杂数据类型#
检测复杂数据类型
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

查看15道真题和解析