instanceof和typeof运算符的区别详解


在JavaScript中,`instanceof` 和 `typeof` 是两个常用的运算符,它们用于判断一个值的类型,但它们在用途和原理上存在一些重要的区别。

### `typeof` 运算符

- **用途**:`typeof` 运算符用于确定一个变量或值的类型。

- **返回值**:它返回一个表示未定义、函数、对象(对于数组和null也返回'object')、布尔值、数字、字符串等类型的字符串。

- **局限性**:对于数组和null,`typeof` 都会返回 `'object'`,这可能会导致混淆。对于函数,它返回 `'function'`,但在ES6及以后的版本中,引入了箭头函数等新的函数形式,尽管它们的行为类似于函数,但`typeof` 仍然将它们视为 `'function'`。

**示例**:


console.log(typeof 42);            // "number"
console.log(typeof 'blubber');     // "string"
console.log(typeof true);          // "boolean"
console.log(typeof undefined);     // "undefined"
console.log(typeof null);          // "object" (注意这里的特殊情况)
console.log(typeof {my: 'property'}); // "object"
console.log(typeof [1, 2, 3]);     // "object" (数组也被认为是对象)
console.log(typeof function(){});  // "function"

### `instanceof` 运算符

- **用途**:`instanceof` 运算符用于测试一个对象在其原型链中是否存在一个构造函数的 `prototype` 属性。

- **返回值**:如果对象在其原型链中有该构造函数的 `prototype` 属性,则返回 `true`;否则返回 `false`。

- **用途扩展**:它对于判断一个对象是否属于某个类(构造函数)创建的实例非常有用。

**示例**:


function Car(make, model) {
  this.make = make;
  this.model = model;
}

const myCar = new Car('Ford', 'Mustang');

console.log(myCar instanceof Car); // true
console.log(myCar instanceof Object); // true,因为Car的原型链中包含了Object.prototype
console.log([] instanceof Array); // true
console.log(null instanceof Object); // false,因为null不是对象
console.log(typeof null === 'object'); // true,但instanceof可以更准确地区分null和对象

### 总结

- 使用 `typeof` 来判断一个值的基本类型(如数字、字符串、布尔值等)或者判断一个变量是否已经被赋值(未赋值则为 `'undefined'`)。

- 使用 `instanceof` 来判断一个对象是否是其原型链上某个构造函数的实例,这对于处理对象继承和类型检测非常有用。