no-extra-parens
The --fix option on the command line can automatically fix some of the problems reported by this rule.
Disallows unnecessary parentheses.
This rule restricts the use of parentheses to only where they are necessary.
Rule Details
This rule always ignores extra parentheses around the following:
- RegExp literals such as (/abc/).test(var)to avoid conflicts with the wrap-regex rule
- immediately-invoked function expressions (also known as IIFEs) such as var x = (function () {})();andvar x = (function () {}());to avoid conflicts with the wrap-iife rule
- arrow function arguments to avoid conflicts with the arrow-parens rule
Options
This rule has a string option:
- "all"(default) disallows unnecessary parentheses around any expression
- "functions"disallows unnecessary parentheses only around function expressions
This rule has an object option for exceptions to the "all" option:
- "conditionalAssign": falseallows extra parentheses around assignments in conditional test expressions
- "returnAssign": falseallows extra parentheses around assignments in- returnstatements
- "nestedBinaryExpressions": falseallows extra parentheses in nested binary expressions
- "ignoreJSX": "none|all|multi-line|single-line"allows extra parentheses around no/all/multi-line/single-line JSX components. Defaults to- none.
- "enforceForArrowConditionals": falseallows extra parentheses around ternary expressions which are the body of an arrow function
- "enforceForSequenceExpressions": falseallows extra parentheses around sequence expressions
- "enforceForNewInMemberExpressions": falseallows extra parentheses around- newexpressions in member expressions
- "enforceForFunctionPrototypeMethods": falseallows extra parentheses around immediate- .calland- .applymethod calls on function expressions and around function expressions in the same context.
all
Examples of incorrect code for this rule with the default "all" option:
/* eslint no-extra-parens: "error" */
a = (b * c);
(a * b) + c;
for (a in (b, c));
for (a in (b));
for (a of (b));
typeof (a);
(function(){} ? a() : b());
class A {
    [(x)] = 1;
}
class B {
    x = (y + z);
}
Examples of correct code for this rule with the default "all" option:
/* eslint no-extra-parens: "error" */
(0).toString();
(Object.prototype.toString.call());
({}.toString.call());
(function(){}) ? a() : b();
(/^a$/).test(x);
for (a of (b, c));
for (a of b);
for (a in b, c);
for (a in b);
class A {
    [x] = 1;
}
class B {
    x = y + z;
}
conditionalAssign
Examples of correct code for this rule with the "all" and { "conditionalAssign": false } options:
/* eslint no-extra-parens: ["error", "all", { "conditionalAssign": false }] */
while ((foo = bar())) {}
if ((foo = bar())) {}
do; while ((foo = bar()))
for (;(a = b););
returnAssign
Examples of correct code for this rule with the "all" and { "returnAssign": false } options:
/* eslint no-extra-parens: ["error", "all", { "returnAssign": false }] */
function a(b) {
  return (b = 1);
}
function a(b) {
  return b ? (c = d) : (c = e);
}
b => (b = 1);
b => b ? (c = d) : (c = e);
nestedBinaryExpressions
Examples of correct code for this rule with the "all" and { "nestedBinaryExpressions": false } options:
/* eslint no-extra-parens: ["error", "all", { "nestedBinaryExpressions": false }] */
x = a || (b && c);
x = a + (b * c);
x = (a * b) / c;
ignoreJSX
Examples of correct code for this rule with the all and { "ignoreJSX": "all" } options:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "all" }] */
const Component = (<div />)
const Component = (
    <div
        prop={true}
    />
)
Examples of incorrect code for this rule with the all and { "ignoreJSX": "multi-line" } options:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "multi-line" }] */
const Component = (<div />)
const Component = (<div><p /></div>)
Examples of correct code for this rule with the all and { "ignoreJSX": "multi-line" } options:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "multi-line" }] */
const Component = (
    <div>
        <p />
    </div>
)
const Component = (
    <div
        prop={true}
    />
)
Examples of incorrect code for this rule with the all and { "ignoreJSX": "single-line" } options:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "single-line" }] */
const Component = (
    <div>
        <p />
    </div>
)
const Component = (
    <div
        prop={true}
    />
)
Examples of correct code for this rule with the all and { "ignoreJSX": "single-line" } options:
/* eslint no-extra-parens: ["error", "all", { ignoreJSX: "single-line" }] */
const Component = (<div />)
const Component = (<div><p /></div>)
enforceForArrowConditionals
Examples of correct code for this rule with the "all" and { "enforceForArrowConditionals": false } options:
/* eslint no-extra-parens: ["error", "all", { "enforceForArrowConditionals": false }] */
const b = a => 1 ? 2 : 3;
const d = c => (1 ? 2 : 3);
enforceForSequenceExpressions
Examples of correct code for this rule with the "all" and { "enforceForSequenceExpressions": false } options:
/* eslint no-extra-parens: ["error", "all", { "enforceForSequenceExpressions": false }] */
(a, b);
if ((val = foo(), val < 10)) {}
while ((val = foo(), val < 10));
enforceForNewInMemberExpressions
Examples of correct code for this rule with the "all" and { "enforceForNewInMemberExpressions": false } options:
/* eslint no-extra-parens: ["error", "all", { "enforceForNewInMemberExpressions": false }] */
const foo = (new Bar()).baz;
const quux = (new Bar())[baz];
(new Bar()).doSomething();
enforceForFunctionPrototypeMethods
Examples of correct code for this rule with the "all" and { "enforceForFunctionPrototypeMethods": false } options:
/* eslint no-extra-parens: ["error", "all", { "enforceForFunctionPrototypeMethods": false }] */
const foo = (function () {}).call();
const bar = (function () {}).apply();
const baz = (function () {}.call());
const quux = (function () {}.apply());
functions
Examples of incorrect code for this rule with the "functions" option:
/* eslint no-extra-parens: ["error", "functions"] */
((function foo() {}))();
var y = (function () {return 1;});
Examples of correct code for this rule with the "functions" option:
/* eslint no-extra-parens: ["error", "functions"] */
(0).toString();
(Object.prototype.toString.call());
({}.toString.call());
(function(){} ? a() : b());
(/^a$/).test(x);
a = (b * c);
(a * b) + c;
typeof (a);
Related Rules
Further Reading
Version
This rule was introduced in ESLint 0.1.4.