在JavaScript中,`typeof` 和 `instanceof` 是两个用于确定变量类型的操作符,但它们的使用场景和结果有所不同。
### typeof
`typeof` 操作符用于检测给定变量的数据类型,并返回表示该类型的字符串。它对于基本数据类型(如数字、字符串、布尔值等)和函数非常有用,但它在处理对象时通常会返回 `"object"`,即使该对象实际上是数组、`null`(返回 `"object"` 可能是个历史遗留问题)、或者更具体的对象类型。
console.log(typeof 42); // "number"
console.log(typeof "blubber"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof function(){});// "function"
console.log(typeof {myProperty: "value"}); // "object"
console.log(typeof [1, 2, 4]); // "object"
console.log(typeof null); // "object"(注意这里的特殊情况)
### instanceof
`instanceof` 操作符用于检测一个对象是否在其原型链上有构造函数的 `prototype` 属性。它对于检测对象是否属于某个构造函数或类特别有用。
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
// 对于非对象类型的值,instanceof 总是返回 false
console.log(42 instanceof Number); // false,因为Number是一个构造函数,而42是一个基本数据类型
console.log("string" instanceof String); // false,同样,"string"是一个基本数据类型
// 注意:null 和 undefined 不是对象,所以 instanceof 对它们不适用
console.log(null instanceof Object); // false
console.log(undefined instanceof Object); // false
`typeof` 和 `instanceof` 在JavaScript中都是有用的工具,但它们的用途和返回值有所不同。选择哪个取决于你的具体需求。