eslint-plugin-unicorn icon indicating copy to clipboard operation
eslint-plugin-unicorn copied to clipboard

Rule proposal: `no-instanceof-function`

Open dimaMachina opened this issue 1 year ago • 7 comments

Description

similar to https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-instanceof-array.md

Fail

foo instanceof Function

Pass

typeof foo === 'function'

Additional Info

No response

dimaMachina avatar Jun 21 '23 18:06 dimaMachina

another case but to forbid instanceof Object checks in favor truthy check + typeof

Fail

let foo = {}
foo instanceof Object // true

let bar = null
bar instanceof Object // false

Pass

Boolean(foo) && typeof foo === 'object'
Boolean(bar) && typeof bar === 'object'

dimaMachina avatar Jun 21 '23 21:06 dimaMachina

Would make it a generic no-instanceof with default config like ["Array", "Function"].

silverwind avatar Jun 29 '23 23:06 silverwind

Would make it a generic no-instanceof with default config like ["Array", "Function"].

👍

sindresorhus avatar Oct 30 '23 10:10 sindresorhus

Accepted.

sindresorhus avatar Oct 30 '23 10:10 sindresorhus

@dimaMachina From my point of view, foo installceof Object is better than Boolean(foo) && typeof foo === 'object'. People usually forget to add Boolean(foo). Moreover, non-object judgement will be verbose, like if (!(Boolean(foo) && typeof foo === 'object')){} vs if (!(foo instanceof Object)){}. Obviously, the instanceof wins.

zanminkian avatar Mar 09 '24 08:03 zanminkian

instanceof should be avoided for built-ins as it does not work across realms (iframes, Node.js VM, etc).

sindresorhus avatar Mar 10 '24 05:03 sindresorhus

instanceof should be avoided for built-ins as it does not work across realms (iframes, Node.js VM, etc).

Thanks! instanceof seems not safe in some edge case. Personally,I seldom use instanceof. I think we should add a new rule no-instanceof. The default option is all. User can config its options to ['Array','Function','Object'] manually.

zanminkian avatar Mar 20 '24 08:03 zanminkian