Skip to content
← Back to rules

unicorn/no-instanceof-builtins 可疑

💡 A suggestion is available for this rule for some violations.

它做了什么

禁止对 ECMAScript 内建构造函数使用 instanceof,因为:

  • 在不同执行上下文(如 iframe、Web Worker、Node VM 等)中会失效;
  • 通常具有误导性(例如,子类的 instanceof Array 会失败);
  • 总存在更清晰且更安全的替代方案(如 Array.isArraytypeofBuffer.isBuffer 等)。

为什么这是不好的?

instanceof 在不同执行上下文(如 iframe、Web Worker、Node vm)中会失效,并且可能对子类或特殊对象给出误导性的结果。

示例

此规则的错误代码示例:

javascript
if (arr instanceof Array) { … }
if (el instanceof HTMLElement) { … }

此规则的正确代码示例:

javascript
if (Array.isArray(arr)) { … }
if (el?.nodeType === 1) { … }

配置

该规则接受一个配置对象,包含以下属性:

exclude

type: string[]

default: []

排除检查的构造函数名称。

include

type: string[]

default: []

除了默认集合外,额外需要检查的构造函数名称。 使用此选项可扩展规则以包含更多构造函数。

strategy

type: "strict" | "loose"

default: "loose"

控制检查哪些内建构造函数。

  • "loose"(默认):仅检查 ArrayFunctionError(当 useErrorIsErrortrue 时)、以及基本类型包装器
  • "strict":额外检查 Error 类型、集合类型、类型数组以及其他内建构造函数

useErrorIsError

type: boolean

default: false

当为 true 时,检查 instanceof Error 并建议使用 Error.isError() 替代。 需要 Error.isError() 函数 可用。

如何使用

通过配置文件或 CLI 启用此规则,可以使用:

json
{
  "rules": {
    "unicorn/no-instanceof-builtins": "error"
  }
}
bash
oxlint --deny unicorn/no-instanceof-builtins

参考资料