Require === and !== (eqeqeq)
It is considered good practice to use the type-safe equality operators ===
and !==
instead of their regular counterparts ==
and !=
.
The reason for this is that ==
and !=
do type coercion which follows the rather obscure Abstract Equality Comparison Algorithm. For instance, the following statements are all considered true
:
[] == false
[] == ![]
3 == "03"
If one of those occurs in an innocent-looking statement such as a == b
the actual problem is very difficult to spot.
Rule Details
This rule is aimed at eliminating the type-unsafe equality operators.
The following patterns are considered problems:
/* eslint eqeqeq: 2 */
if (x == 42) { } /*error Expected '===' and instead saw '=='.*/
if ("" == text) { } /*error Expected '===' and instead saw '=='.*/
if (obj.getStuff() != undefined) { } /*error Expected '!==' and instead saw '!='.*/
Options
"smart"
This option enforces the use of ===
and !==
except for these cases:
- Comparing two literal values
- Evaluating the value of
typeof
- Comparing against
null
You can specify this option using the following configuration:
"eqeqeq": [2, "smart"]
The following patterns are not considered problems:
/* eslint eqeqeq: [2, "smart"] */
typeof foo == 'undefined'
'hello' != 'world'
0 == 0
true == true
foo == null
The following patterns are considered problems with "smart":
/* eslint eqeqeq: [2, "smart"] */
// comparing two variables requires ===
a == b /*error Expected '===' and instead saw '=='.*/
// only one side is a literal
foo == true /*error Expected '===' and instead saw '=='.*/
bananas != 1 /*error Expected '!==' and instead saw '!='.*/
// comparing to undefined requires ===
value == undefined /*error Expected '===' and instead saw '=='.*/
"allow-null"
This option will enforce ===
and !==
in your code with one exception - it permits comparing to null
to check for null
or undefined
in a single expression.
You can specify this option using the following configuration:
"eqeqeq": [2, "allow-null"]
The following patterns are not considered problems:
/* eslint eqeqeq: [2, "allow-null"] */
foo == null
The following patterns are considered problems with "allow-null":
/* eslint eqeqeq: [2, "allow-null"] */
bananas != 1 /*error Expected '!==' and instead saw '!='.*/
typeof foo == 'undefined' /*error Expected '===' and instead saw '=='.*/
'hello' != 'world' /*error Expected '!==' and instead saw '!='.*/
0 == 0 /*error Expected '===' and instead saw '=='.*/
foo == undefined /*error Expected '===' and instead saw '=='.*/
When Not To Use It
If you don't want to enforce a style for using equality operators, then it's safe to disable this rule.
Version
This rule was introduced in ESLint 0.0.2.