TypeError: invalid 'instanceof' operand 'x'

JavaScript 异常 "invalid 'instanceof' operand"(无效的 instanceof 操作数)发生在 instanceof 操作符的右侧操作数未与构造函数对象一起使用时,即一个拥有 prototype 属性且可调用的对象。

消息

TypeError: Right-hand side of 'instanceof' is not an object (V8-based)
TypeError: invalid 'instanceof' operand "x" (Firefox)
TypeError: Right hand side of instanceof is not an object (Safari)

TypeError: Right-hand side of 'instanceof' is not callable (V8-based)
TypeError: x is not a function (Firefox)
TypeError: x is not a function. (evaluating 'x instanceof y') (Safari)

TypeError: Function has non-object prototype 'undefined' in instanceof check (V8-based)
TypeError: 'prototype' property of x is not an object (Firefox)
TypeError: instanceof called on an object with an invalid prototype property. (Safari)

错误类型

TypeError

哪里出错了?

instanceof 操作符期望右侧操作数是一个构造函数对象,即一个拥有 prototype 属性且可调用的对象。它也可以是一个拥有 Symbol.hasInstance 方法的对象。当出现以下情况时,可能会发生此错误:

  • 右侧操作数不是对象。
  • 右侧操作数不可调用,并且没有 Symbol.hasInstance 方法。
  • 右侧操作数是可调用的,但其 prototype 属性不是对象。(例如,箭头函数没有 prototype 属性。)

示例

instanceof 与 typeof

js
"test" instanceof ""; // TypeError: invalid 'instanceof' operand ""
42 instanceof 0; // TypeError: invalid 'instanceof' operand 0

function Foo() {}
const f = Foo(); // Foo() is called and returns undefined
const x = new Foo();

x instanceof f; // TypeError: invalid 'instanceof' operand f
x instanceof x; // TypeError: x is not a function

要修复这些错误,你需要将 instanceof 操作符替换为 typeof 操作符,或者确保你使用的是函数名称,而不是其求值结果。

js
typeof "test" === "string"; // true
typeof 42 === "number"; // true

function Foo() {}
const f = Foo; // Do not call Foo.
const x = new Foo();

x instanceof f; // true
x instanceof Foo; // true

另见