类型错误:'instanceof' 操作数 'x' 无效

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

¥The JavaScript exception "invalid 'instanceof' operand" occurs when the right-hand side operands of the instanceof operator isn't used with a constructor object, i.e. an object which has a prototype property and is callable.

信息

¥Message

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)

错误类型

¥Error type

TypeError

什么地方出了错?

¥What went wrong?

instanceof 运算符 期望右侧操作数是构造函数对象,即具有 prototype 属性并且可调用的对象。它也可以是具有 Symbol.hasInstance 方法的对象。如果出现以下情况,则可能发生此错误:

¥The instanceof operator expects the right-hand-side operands to be a constructor object, i.e. an object which has a prototype property and is callable. It can also be an object with a Symbol.hasInstance method. This error can occur if:

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

示例

¥Examples

instanceof 与 typeof

¥instanceof vs. 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 运算符,或者确保使用函数名称,而不是其计算结果。

¥To fix these errors, you will either need to replace the instanceof operator with the typeof operator, or to make sure you use the function name, instead of the result of its evaluation.

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

也可以看看

¥See also