diff --git a/docs/rules/no-constant-condition.md b/docs/rules/no-constant-condition.md index 036bbb786b92..8de5e69f3f8f 100644 --- a/docs/rules/no-constant-condition.md +++ b/docs/rules/no-constant-condition.md @@ -32,6 +32,14 @@ if (x &&= false) { doSomethingNever(); } +if (class {}) { + doSomethingAlways(); +} + +if (new Boolean(x)) { + doSomethingAlways(); +} + if (x ||= true) { doSomethingAlways(); } diff --git a/lib/rules/no-constant-condition.js b/lib/rules/no-constant-condition.js index 3c2d68cbf6ca..f0be8c613ec0 100644 --- a/lib/rules/no-constant-condition.js +++ b/lib/rules/no-constant-condition.js @@ -139,6 +139,7 @@ module.exports = { case "ArrowFunctionExpression": case "FunctionExpression": case "ObjectExpression": + case "ClassExpression": return true; case "TemplateLiteral": return (inBooleanPosition && node.quasis.some(quasi => quasi.value.cooked.length)) || @@ -180,7 +181,8 @@ module.exports = { isLeftShortCircuit || isRightShortCircuit; } - + case "NewExpression": + return true; case "AssignmentExpression": if (node.operator === "=") { return isConstant(node.right, inBooleanPosition); diff --git a/tests/lib/rules/no-constant-condition.js b/tests/lib/rules/no-constant-condition.js index ecb6de534260..a00495bbcae4 100644 --- a/tests/lib/rules/no-constant-condition.js +++ b/tests/lib/rules/no-constant-condition.js @@ -387,6 +387,16 @@ ruleTester.run("no-constant-condition", rule, { { code: "if(0b1n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] }, { code: "if(0o1n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] }, { code: "if(0x1n);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "Literal" }] }, - { code: "if(0x1n || foo);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "LogicalExpression" }] } + { code: "if(0x1n || foo);", parserOptions: { ecmaVersion: 11 }, errors: [{ messageId: "unexpected", type: "LogicalExpression" }] }, + + // Classes and instances are always truthy + { code: "if(class {}) {}", errors: [{ messageId: "unexpected" }] }, + { code: "if(new Foo()) {}", errors: [{ messageId: "unexpected" }] }, + + // Boxed primitives are always truthy + { code: "if(new Boolean(foo)) {}", errors: [{ messageId: "unexpected" }] }, + { code: "if(new String(foo)) {}", errors: [{ messageId: "unexpected" }] }, + { code: "if(new Number(foo)) {}", errors: [{ messageId: "unexpected" }] } + ] });