如何使用 instanceof 操作符(附代码)

88 阅读3分钟

instanceof操作符返回布尔值,表示一个对象是否是特定类的一个实例。

JavaScript instanceof操作符

JavaScript instanceof是一个内置的操作符,它测试构造函数的原型属性是否出现在一个对象的原型链中的任何地方。instanceof 操作符检查构造函数.type在对象的原型链中是否存在。

instanceof操作符被用来在运行时检查对象的类型。此外,instanceof 操作符测试 对象的 原型链中 是否 存在构造函数.prototype

它检查当前对象,如果该对象是指定的对象类型,则返回真。 左手边(LHS)操作数是一个被测试的实际对象,右手边(RHS)操作数是一个类的实际构造器。

语法

object instanceof constructor

对象 是被测试的,构造函数是要测试的函数。

请看下面的例子:

let str = 'The website is appdividend'; 
let myString  = new String();
let nStr    = new String('String created with constructor');
let mDate    = new Date();
let mObj     = {};
let mNonObj = Object.create(null);

console.log(str instanceof String)
console.log(myString instanceof String)
console.log(nStr instanceof String)
console.log(mDate instanceof Date)
console.log(mObj instanceof Object)
console.log(mNonObj instanceof Object)

请看下面的输出:

➜  es git:(master) ✗ node app
false
true
true
true
true
false

在上面的例子中,你可以看到,如果我们使用了构造函数,那么它返回真,否则返回假。 有一点值得一提的是,如果对象继承了类的原型,那么instanceof的值就是真值。

另外,正如你已经注意到的,String(value)和new String(value)做了不同的事情。如果你调用内置类型的构造函数而不使用new操作符,它们会尝试将参数('cast')转换为一个特定的类型。

如果你使用new操作符,它们会创建包装对象。

请看下面的代码:

let e = new Employee("Eleven");
e instanceof Employee

那就是e instanceof Employee是真的,因为e继承自Employee.prototype

函数原型

让我们来看看另一个例子:

// app.js

function App(name, price, size) {
  this.name = name;
  this.price = price;
  this.size = size;
}
let oz = new App('oz', 15, 1024)
console.log(oz instanceof App);
console.log(oz instanceof Object);

在上面的例子中,我们创建了一个名为App的函数原型,它将作为一个构造函数,这就是为什么当我们从函数原型创建一个对象时,它返回真。

当es6不存在的时候,这就是你需要创建一种类的方式。请看下面的输出:

➜  es git:(master) ✗ node app
true
true

JavaScript中的每个对象都有一个原型,可以通过__proto__属性访问。函数也有原型属性,它是由函数创建的对象的一个初始__proto__。当函数被创建时,它被赋予唯一的对象作为原型。一个instanceof**操作符使用这个唯一性来为你提供答案。

值得注意的是,在声明对象时,instanceof是用 "new "关键字定义的。

指定 "new"实际上是将字符串构造函数的结束状态复制到变量中,而不是仅仅将其设置为返回值。我认为这更好地展示了new关键字的作用。

instanceof Array内置函数

请看下面的Array的例子:

let arr = [1, 2, 3];

console.log(arr instanceof Array);
console.log(arr instanceof Object);

请看下面的输出:

➜  es git:(master) ✗ node app
true
true

请注意,arr也属于Object类。这是因为Array的原型是继承自Object的。

Javascript instanceof number

字符串和数字是原始数据类型,而不是对象和数组。因此它们没有[[Prototype]],所以只有当你把它们包裹在普通的对象中(在Java中称为'boxing'),它才能工作。

这就是为什么如果我们对数字进行检查,它将返回错误。

请看下面的例子:

let num = 21

console.log(num instanceof Number);

请看下面的输出:

➜  es git:(master) ✗ node app
false

对于基元,它将以小写字母返回其类型*。* 对于对象,它将以标题大小写返回它们的类别

如果你不想辨别基元值和包装对象(不管出于什么原因,可能是不好的原因),使用typeof()函数。

本教程就到此为止。