There are two kinds equality operators:

    • ===: strict equality comparison using "triple equals"
    • ==: loose or abstract equality comparison using "double equals", which first uses type coercion to convert values to the same type, and then compares them

    There's no built-in way to compare values for "structural equality" (e.g. comparing two arrays to see if they contain the same elements)

    Strict equality

    We should almost always use strict equality comparison with ===, since the behavior is more consistent.

    Loose equality

    Loose equality can be convenient, but is less consistent, so it's best to use === instead.

    Structural equality

    If we want to compare structural equality, we'll usually turn to a 3rd party library, such as lodash.isequal.


    Many built-in methods use the SameValueZero algorithm to test for equality, instead of == or ===. However, the differences are only relevant in edge cases, so it's generally safe to think of this as === equality.