function equate(subject, other) {
    if (subject === other || (isExactlyNaN(subject) && isExactlyNaN(other))) {
        return true;
    }

    // Custom equality.
    let customEquality = tryEquate_custom(subject, other);
    if (customEquality !== undefined) {
        return customEquality;
    }
    if (isAtomic(subject) || isAtomic(other) || !eqType(subject, other)) {
        return false;
    }

    // Collection equality.
    if (subject instanceof Map) {
        return equate_Maps(subject, other);
    }
    if (subject instanceof Set) {
        return equate_Sets(subject, other);
    }
    if (isIndexable(subject)) {
        return equate_Indexables(subject, other);
    }

    // Object equality.
    return equate_Objects(subject, other);
}
Determines if two values are currently equivalent.

Values that are equal according to === are currently equivalent.
NaN is currently equivalent to NaN.
Values with an `isEqualTo` method are currently equivalent to values that return true when passed to that method.
Collections of the same type that contain currently equivalent entries are currently equivalent.
Objects of the same type with equivalent same own properties and iterables are currently equivalent.

@param {*} subject
@param {*} other
@returns {!boolean}