# JavaScript Equality Operators

> Learn the JavaScript equality operators ==, !=, === and !==, the difference between strict and loose checks, and quirks like NaN never equaling NaN.

Author: [Flavio Copes](https://flaviocopes.com/about/) | Published: 2019-05-31 | Topics: [JavaScript](https://flaviocopes.com/tags/js/) | Canonical: https://flaviocopes.com/javascript-equality-operators/

Those operators accept two values and return a boolean:

- `==` checks for equality
- `!=` checks for inequality
- `===` checks for strict equality
- `!==` checks for strict inequality

Let's talk what we mean for _strict_. Without the strict check, the second operand is converted to the type of the first before making the comparison. Strict prevents this.

Examples:

```js
const a = true

a == true //true
a === true //true

1 == 1 //true
1 == '1' //true
1 === 1 //true
1 === '1' //false
```

You cannot check objects for equality: two objects are never equal to each other. The only case when a check might be true is if two variables reference the same object.

Some peculiarities to be aware: `NaN` is always different from `NaN`.

```js
NaN == NaN //false
```

`null` and `undefined` values are equal if compared in non-strict mode:

```js
null == undefined //true
null === undefined //false
```

I built a free [JS equality explorer](https://flaviocopes.com/tools/js-equality/) where you can try any comparison and see the coercion steps behind it.
