JavaScript instanceof 怎么用

在前端开发里,你肯定遇过要判断一个东西是不是“某一类”的情况——比如拿到一个数据,想知道它是不是数组,或者是不是自己写的某个自定义对象。这时候,instanceof 就能派上用场,但很多新手刚接触它时,总会搞混它和普通判断的区别。

先搞懂`instanceof`的核心逻辑

instanceof 不是用来检查“值是不是等于某个东西”,而是用来检查“一个对象是不是某个构造函数的‘后代实例’”。打个比方,你可以把构造函数理解成“图纸”,用它做出来的对象就是“成品”——instanceof 就是检查这个成品,是不是按照某张特定图纸做出来的。

JavaScript instanceof 怎么用

举个最生活化的例子:假设“构造函数”是“苹果工厂”,它做出来的成品是“红富士苹果”。那你拿一个红富士苹果,问红富士苹果 instanceof 苹果工厂,结果就会是true;如果拿一个橘子,问同样的问题,结果就是false——它不是用苹果工厂做的。

怎么用`instanceof`做常用判断

日常开发里,instanceof 最常用的场景是判断数据类型,尤其是普通typeof搞不定的引用类型。

比如typeof判断数组时,会返回object,你没法直接知道它是不是数组,这时候instanceof就好用:

`javascript

// 定义一个数组

const fruitList = ['苹果', '香蕉', '橘子'];

// 判断是不是数组

console.log(fruitList instanceof Array); // 输出true

`

再比如判断自定义对象,假设你写了一个“猫”的构造函数,用来生成猫的实例:

`javascript

// 自定义构造函数

function Cat(name) {

this.name = name;

}

// 生成一只猫的实例

const myCat = new Cat('咪咪');

// 判断是不是Cat类的实例

console.log(myCat instanceof Cat); // 输出true

`

如果拿这个猫的实例去判断instanceof Dog,结果肯定是false——它是用猫的图纸做的,不是狗的。

用的时候要注意2个坑

instanceof虽然方便,但有两个很容易踩的陷阱,得特别留意。

第一个坑:跨窗口或跨框架的对象。比如你在浏览器里开了两个标签页(相当于两个独立窗口),其中一个标签页里的数组,传到另一个标签页里,这时候用instanceof Array判断会返回false——因为两个窗口的Array构造函数不是同一个,instanceof不认不同上下文里的“同一张图纸”。

第二个坑:原始类型用不了instanceof。instanceof只能判断对象类型,要是你拿数字、字符串这种原始值去用,会直接返回false:

`javascript

const num = 123;

console.log(num instanceof Number); // 输出false

`

因为原始值不是“用构造函数做出来的实例”,它本身就是基础类型,不是对象。如果真要判断原始类型,用typeof更合适。

和`typeof`的区别别搞混

很多新手会把instanceof和typeof搞混,其实它们分工明确:typeof是查“值的基本类型”,比如typeof 123返回number,typeof 'abc'返回string,但它分不清数组、普通对象这些引用类型;instanceof是查“是不是某个构造函数的实例”,专门用来区分引用类型里的不同“类别”。

比如你想判断一个数据是不是数组,typeof给不了准确结果,就得用instanceof Array;但要是判断一个数是不是数字,用typeof就够了,没必要用instanceof Number。

搞懂这些,你就能避开instanceof的坑,在需要判断对象所属类别的时候,用它写出更准确的代码。

上一篇 PHP switch 怎么用