An unused expression which has no effect on the state of the program indicates a logic error.
For example, n + 1; is not a syntax error, but it might be a typing mistake where a programmer meant an assignment statement n += 1; instead.
Rule Details
This rule aims to eliminate unused expressions which have no effect on the state of the program.
This rule does not apply to function calls or constructor calls with the new operator, because they could have side effects on the state of the program.
var i =0;
functionincrement(){ i +=1;}
increment();// return value is unused, but i changed as a side effect
var nThings =0;
functionThing(){ nThings +=1;}
newThing();// constructed object is unused, but nThings changed as a side effect
This rule does not apply to directives (which are in the form of literal string expressions such as "use strict"; at the beginning of a script, module, or function).
Sequence expressions (those using a comma, such as a = 1, b = 2) are always considered unused unless their return value is assigned or used in a condition evaluation, or a function call is made with the sequence expression value.
Options
This rule, in its default state, does not require any arguments. If you would like to enable one or more of the following you may pass an object with the options set as follows:
allowShortCircuit set to true will allow you to use short circuit evaluations in your expressions (Default: false).
allowTernary set to true will enable you to use ternary operators in your expressions similarly to short circuit evaluations (Default: false).
allowTaggedTemplates set to true will enable you to use tagged template literals in your expressions (Default: false).
These options allow unused expressions only if all of the code paths either directly change the state (for example, assignment statement) or could have side effects (for example, function call).
Examples of incorrect code for the default { "allowShortCircuit": false, "allowTernary": false } options:
Note that one or more string expression statements (with or without semi-colons) will only be considered as unused if they are not in the beginning of a script, module, or function (alone and uninterrupted by other statements). Otherwise, they will be treated as part of a "directive prologue", a section potentially usable by JavaScript engines. This includes "strict mode" directives.
"use strict";
"use asm"
"use stricter";
"use babel"
"any other strings like this in the prologue";
Examples of correct code for the default { "allowShortCircuit": false, "allowTernary": false } options:
/*eslint no-unused-expressions: "error"*/
{}// In this context, this is a block statement, not an object literal
{myLabel: someVar}// In this context, this is a block statement with a label and expression, not an object literal
functionnamedFunctionDeclaration(){}
(functionaGenuineIIFE(){}());
f()
a =0
newC
delete a.b
void a
allowShortCircuit
Examples of incorrect code for the { "allowShortCircuit": true } option:
You can immediately invoke function expressions, but not function declarations. A common technique to create an immediately-invoked function expression (IIFE) is to wrap a function declaration in parentheses. The opening parentheses causes the contained function to be parsed as an expression, rather than a declaration.
// function expression could be unwrapped
varx=function(){return{y:1};}();
// function declaration must be wrapped
function(){/* side effects */}();// SyntaxError
Rule Details
This rule requires all immediately-invoked function expressions to be wrapped in parentheses.
Options
This rule has two options, a string option and an object option.
String option:
"outside" enforces always wrapping the call expression. The default is "outside".
"inside" enforces always wrapping the function expression.
"any" enforces always wrapping, but allows either style.
Object option:
"functionPrototypeMethods": true additionally enforces wrapping function expressions invoked using .call and .apply. The default is false.
outside
Examples of incorrect code for the default "outside" option:
/*eslint wrap-iife: ["error", "outside"]*/
varx=function(){return{y:1};}();// unwrapped
var x =(function(){return{y:1};})();// wrapped function expression
Examples of correct code for the default "outside" option:
/*eslint wrap-iife: ["error", "outside"]*/
var x =(function(){return{y:1};}());// wrapped call expression
inside
Examples of incorrect code for the "inside" option:
/*eslint wrap-iife: ["error", "inside"]*/
varx=function(){return{y:1};}();// unwrapped
var x =(function(){return{y:1};}());// wrapped call expression
Examples of correct code for the "inside" option:
/*eslint wrap-iife: ["error", "inside"]*/
var x =(function(){return{y:1};})();// wrapped function expression
any
Examples of incorrect code for the "any" option:
/*eslint wrap-iife: ["error", "any"]*/
varx=function(){return{y:1};}();// unwrapped
Examples of correct code for the "any" option:
/*eslint wrap-iife: ["error", "any"]*/
var x =(function(){return{y:1};}());// wrapped call expression
var x =(function(){return{y:1};})();// wrapped function expression
functionPrototypeMethods
Examples of incorrect code for this rule with the "inside", { "functionPrototypeMethods": true } options:
An unused expression which has no effect on the state of the program indicates a logic error.
For example, n + 1; is not a syntax error, but it might be a typing mistake where a programmer meant an assignment statement n += 1; instead.
Rule Details
This rule aims to eliminate unused expressions which have no effect on the state of the program.
This rule does not apply to function calls or constructor calls with the new operator, because they could have side effects on the state of the program.
var i =0;
functionincrement(){ i +=1;}
increment();// return value is unused, but i changed as a side effect
var nThings =0;
functionThing(){ nThings +=1;}
newThing();// constructed object is unused, but nThings changed as a side effect
This rule does not apply to directives (which are in the form of literal string expressions such as "use strict"; at the beginning of a script, module, or function).
Sequence expressions (those using a comma, such as a = 1, b = 2) are always considered unused unless their return value is assigned or used in a condition evaluation, or a function call is made with the sequence expression value.
Options
This rule, in its default state, does not require any arguments. If you would like to enable one or more of the following you may pass an object with the options set as follows:
allowShortCircuit set to true will allow you to use short circuit evaluations in your expressions (Default: false).
allowTernary set to true will enable you to use ternary operators in your expressions similarly to short circuit evaluations (Default: false).
allowTaggedTemplates set to true will enable you to use tagged template literals in your expressions (Default: false).
These options allow unused expressions only if all of the code paths either directly change the state (for example, assignment statement) or could have side effects (for example, function call).
Examples of incorrect code for the default { "allowShortCircuit": false, "allowTernary": false } options:
Note that one or more string expression statements (with or without semi-colons) will only be considered as unused if they are not in the beginning of a script, module, or function (alone and uninterrupted by other statements). Otherwise, they will be treated as part of a "directive prologue", a section potentially usable by JavaScript engines. This includes "strict mode" directives.
"use strict";
"use asm"
"use stricter";
"use babel"
"any other strings like this in the prologue";
Examples of correct code for the default { "allowShortCircuit": false, "allowTernary": false } options:
/*eslint no-unused-expressions: "error"*/
{}// In this context, this is a block statement, not an object literal
{myLabel: someVar}// In this context, this is a block statement with a label and expression, not an object literal
functionnamedFunctionDeclaration(){}
(functionaGenuineIIFE(){}());
f()
a =0
newC
delete a.b
void a
allowShortCircuit
Examples of incorrect code for the { "allowShortCircuit": true } option:
Empty block statements, while not technically errors, usually occur due to refactoring that wasn't completed. They can cause confusion when reading code.
Rule Details
This rule disallows empty block statements. This rule ignores block statements which contain a comment (for example, in an empty catch or finally block of a try statement to indicate that execution should continue regardless of errors).
Examples of incorrect code for this rule:
/*eslint no-empty: "error"*/
if(foo){
}
while(foo){
}
switch(foo){
}
try{
doSomething();
}catch(ex){
}finally{
}
Examples of correct code for this rule:
/*eslint no-empty: "error"*/
if(foo){
// empty
}
while(foo){
/* empty */
}
try{
doSomething();
}catch(ex){
// continue regardless of error
}
try{
doSomething();
}finally{
/* continue regardless of error */
}
Options
This rule has an object option for exceptions:
"allowEmptyCatch": true allows empty catch clauses (that is, which do not contain a comment)
allowEmptyCatch
Examples of additional correct code for this rule with the { "allowEmptyCatch": true } option:
You can immediately invoke function expressions, but not function declarations. A common technique to create an immediately-invoked function expression (IIFE) is to wrap a function declaration in parentheses. The opening parentheses causes the contained function to be parsed as an expression, rather than a declaration.
// function expression could be unwrapped
varx=function(){return{y:1};}();
// function declaration must be wrapped
function(){/* side effects */}();// SyntaxError
Rule Details
This rule requires all immediately-invoked function expressions to be wrapped in parentheses.
Options
This rule has two options, a string option and an object option.
String option:
"outside" enforces always wrapping the call expression. The default is "outside".
"inside" enforces always wrapping the function expression.
"any" enforces always wrapping, but allows either style.
Object option:
"functionPrototypeMethods": true additionally enforces wrapping function expressions invoked using .call and .apply. The default is false.
outside
Examples of incorrect code for the default "outside" option:
/*eslint wrap-iife: ["error", "outside"]*/
varx=function(){return{y:1};}();// unwrapped
var x =(function(){return{y:1};})();// wrapped function expression
Examples of correct code for the default "outside" option:
/*eslint wrap-iife: ["error", "outside"]*/
var x =(function(){return{y:1};}());// wrapped call expression
inside
Examples of incorrect code for the "inside" option:
/*eslint wrap-iife: ["error", "inside"]*/
varx=function(){return{y:1};}();// unwrapped
var x =(function(){return{y:1};}());// wrapped call expression
Examples of correct code for the "inside" option:
/*eslint wrap-iife: ["error", "inside"]*/
var x =(function(){return{y:1};})();// wrapped function expression
any
Examples of incorrect code for the "any" option:
/*eslint wrap-iife: ["error", "any"]*/
varx=function(){return{y:1};}();// unwrapped
Examples of correct code for the "any" option:
/*eslint wrap-iife: ["error", "any"]*/
var x =(function(){return{y:1};}());// wrapped call expression
var x =(function(){return{y:1};})();// wrapped function expression
functionPrototypeMethods
Examples of incorrect code for this rule with the "inside", { "functionPrototypeMethods": true } options:
An unused expression which has no effect on the state of the program indicates a logic error.
For example, n + 1; is not a syntax error, but it might be a typing mistake where a programmer meant an assignment statement n += 1; instead.
Rule Details
This rule aims to eliminate unused expressions which have no effect on the state of the program.
This rule does not apply to function calls or constructor calls with the new operator, because they could have side effects on the state of the program.
var i =0;
functionincrement(){ i +=1;}
increment();// return value is unused, but i changed as a side effect
var nThings =0;
functionThing(){ nThings +=1;}
newThing();// constructed object is unused, but nThings changed as a side effect
This rule does not apply to directives (which are in the form of literal string expressions such as "use strict"; at the beginning of a script, module, or function).
Sequence expressions (those using a comma, such as a = 1, b = 2) are always considered unused unless their return value is assigned or used in a condition evaluation, or a function call is made with the sequence expression value.
Options
This rule, in its default state, does not require any arguments. If you would like to enable one or more of the following you may pass an object with the options set as follows:
allowShortCircuit set to true will allow you to use short circuit evaluations in your expressions (Default: false).
allowTernary set to true will enable you to use ternary operators in your expressions similarly to short circuit evaluations (Default: false).
allowTaggedTemplates set to true will enable you to use tagged template literals in your expressions (Default: false).
These options allow unused expressions only if all of the code paths either directly change the state (for example, assignment statement) or could have side effects (for example, function call).
Examples of incorrect code for the default { "allowShortCircuit": false, "allowTernary": false } options:
Note that one or more string expression statements (with or without semi-colons) will only be considered as unused if they are not in the beginning of a script, module, or function (alone and uninterrupted by other statements). Otherwise, they will be treated as part of a "directive prologue", a section potentially usable by JavaScript engines. This includes "strict mode" directives.
"use strict";
"use asm"
"use stricter";
"use babel"
"any other strings like this in the prologue";
Examples of correct code for the default { "allowShortCircuit": false, "allowTernary": false } options:
/*eslint no-unused-expressions: "error"*/
{}// In this context, this is a block statement, not an object literal
{myLabel: someVar}// In this context, this is a block statement with a label and expression, not an object literal
functionnamedFunctionDeclaration(){}
(functionaGenuineIIFE(){}());
f()
a =0
newC
delete a.b
void a
allowShortCircuit
Examples of incorrect code for the { "allowShortCircuit": true } option:
An unused expression which has no effect on the state of the program indicates a logic error.
For example, n + 1; is not a syntax error, but it might be a typing mistake where a programmer meant an assignment statement n += 1; instead.
Rule Details
This rule aims to eliminate unused expressions which have no effect on the state of the program.
This rule does not apply to function calls or constructor calls with the new operator, because they could have side effects on the state of the program.
var i =0;
functionincrement(){ i +=1;}
increment();// return value is unused, but i changed as a side effect
var nThings =0;
functionThing(){ nThings +=1;}
newThing();// constructed object is unused, but nThings changed as a side effect
This rule does not apply to directives (which are in the form of literal string expressions such as "use strict"; at the beginning of a script, module, or function).
Sequence expressions (those using a comma, such as a = 1, b = 2) are always considered unused unless their return value is assigned or used in a condition evaluation, or a function call is made with the sequence expression value.
Options
This rule, in its default state, does not require any arguments. If you would like to enable one or more of the following you may pass an object with the options set as follows:
allowShortCircuit set to true will allow you to use short circuit evaluations in your expressions (Default: false).
allowTernary set to true will enable you to use ternary operators in your expressions similarly to short circuit evaluations (Default: false).
allowTaggedTemplates set to true will enable you to use tagged template literals in your expressions (Default: false).
These options allow unused expressions only if all of the code paths either directly change the state (for example, assignment statement) or could have side effects (for example, function call).
Examples of incorrect code for the default { "allowShortCircuit": false, "allowTernary": false } options:
Note that one or more string expression statements (with or without semi-colons) will only be considered as unused if they are not in the beginning of a script, module, or function (alone and uninterrupted by other statements). Otherwise, they will be treated as part of a "directive prologue", a section potentially usable by JavaScript engines. This includes "strict mode" directives.
"use strict";
"use asm"
"use stricter";
"use babel"
"any other strings like this in the prologue";
Examples of correct code for the default { "allowShortCircuit": false, "allowTernary": false } options:
/*eslint no-unused-expressions: "error"*/
{}// In this context, this is a block statement, not an object literal
{myLabel: someVar}// In this context, this is a block statement with a label and expression, not an object literal
functionnamedFunctionDeclaration(){}
(functionaGenuineIIFE(){}());
f()
a =0
newC
delete a.b
void a
allowShortCircuit
Examples of incorrect code for the { "allowShortCircuit": true } option:
An unused expression which has no effect on the state of the program indicates a logic error.
For example, n + 1; is not a syntax error, but it might be a typing mistake where a programmer meant an assignment statement n += 1; instead.
Rule Details
This rule aims to eliminate unused expressions which have no effect on the state of the program.
This rule does not apply to function calls or constructor calls with the new operator, because they could have side effects on the state of the program.
var i =0;
functionincrement(){ i +=1;}
increment();// return value is unused, but i changed as a side effect
var nThings =0;
functionThing(){ nThings +=1;}
newThing();// constructed object is unused, but nThings changed as a side effect
This rule does not apply to directives (which are in the form of literal string expressions such as "use strict"; at the beginning of a script, module, or function).
Sequence expressions (those using a comma, such as a = 1, b = 2) are always considered unused unless their return value is assigned or used in a condition evaluation, or a function call is made with the sequence expression value.
Options
This rule, in its default state, does not require any arguments. If you would like to enable one or more of the following you may pass an object with the options set as follows:
allowShortCircuit set to true will allow you to use short circuit evaluations in your expressions (Default: false).
allowTernary set to true will enable you to use ternary operators in your expressions similarly to short circuit evaluations (Default: false).
allowTaggedTemplates set to true will enable you to use tagged template literals in your expressions (Default: false).
These options allow unused expressions only if all of the code paths either directly change the state (for example, assignment statement) or could have side effects (for example, function call).
Examples of incorrect code for the default { "allowShortCircuit": false, "allowTernary": false } options:
Note that one or more string expression statements (with or without semi-colons) will only be considered as unused if they are not in the beginning of a script, module, or function (alone and uninterrupted by other statements). Otherwise, they will be treated as part of a "directive prologue", a section potentially usable by JavaScript engines. This includes "strict mode" directives.
"use strict";
"use asm"
"use stricter";
"use babel"
"any other strings like this in the prologue";
Examples of correct code for the default { "allowShortCircuit": false, "allowTernary": false } options:
/*eslint no-unused-expressions: "error"*/
{}// In this context, this is a block statement, not an object literal
{myLabel: someVar}// In this context, this is a block statement with a label and expression, not an object literal
functionnamedFunctionDeclaration(){}
(functionaGenuineIIFE(){}());
f()
a =0
newC
delete a.b
void a
allowShortCircuit
Examples of incorrect code for the { "allowShortCircuit": true } option: