在JavaScript中,typeof和instanceof是两个用于检查变量类型的操作符,但它们具有不同的用途和区别。
-
typeof
:是一个一元操作符,用于确定给定变量的数据类型。它返回一个字符串,表示变量的数据类型。typeof可以用于任何变量,包括基本数据类型(如字符串、数字、布尔值)和引用数据类型(如对象、数组、函数等)。//1. 数字类型、NAN,返回值 number typeof 42; // "number" //2. 字符串类型,返回值 string typeof "Hello"; // "string" //3. 布尔类型,返回值 boolean typeof true; // "boolean" //4. 对象、数组、null 类型,返回值 object typeof null; // "object" typeof [1, 2, 3]; // "object" typeof {name: "John", age: 30}; // "object" //5. 函数类型,返回值 function typeof function() {} // "function" //6. 不存在的变量、函数或者 undefined,返回值 undefined typeof undefined; // "undefined"
-
instanceof
:是一个二元操作符,用于检查对象是否属于指定的构造函数的实例。它返回一个布尔值,表示对象是否是特定构造函数的实例或其子类的实例。[1,2] instanceof Array // true //简单数字和字符串 与 String和Number构造函数 构造出来的不一样 console.log('231' instanceof String) //false console.log(231 instanceof Number) //false let a = new String('231') let b = new Number(231) console.log(a instanceof String) //true console.log(b instanceof Number) //true //简单用法 Person的原型在p的原型链中 function Person(){}; var p =new Person(); console.log(p instanceof Person); //true //继承中判断实例是否属于它的父类 Student和Person都在s的原型链中 function Person(){}; function Student(){}; var p = new Person(); Student.prototype = p; //继承原型⚠ var s = new Student(); console.log(s instanceof Student); //true console.log(s instanceof Person); //true //对应上述规范做个函数模拟A instanceof B: function _instanceof(A, B) { var O = B.prototype; // 取B的显示原型 A = A.proto; // 取A的隐式原型 while (true) { //Object.prototype.proto === null if (A === null) return false; if (O === A) // 这里重点:当 O 严格等于 A 时,返回 true return true; A = A.proto; } }
🔵区别:
- typeof用于确定变量的数据类型,而instanceof用于确定对象是否为某个构造函数的实例。
- 虽然typeof可以检查基本数据类型和引用数据类型,但无法检查对象的具体类型。
- 而instanceof可以在对象的继承链上进行检查,可以明确对象是否为某个类的实例或其子类的实例。