isEqual.js

import isEqualDeep from './internals/isEqualDeep';
import { nativeUndefined } from './internals/native';
/**
 * 深度比较两个值是否相等。
 *
 * 支持比较 `boolean` `number` `string` `symbol` `array` `array buffer` `date` `error` `map` `object` `regexp` `set` `typed array` 类型。对象只比较自身的属性,不包括继承和不可枚举的属性。
 *
 * 如果 `strictCheck=true`, 以下值不相等:
 *
 * 1. `0` `-0`
 * 2. `typeof` 不同类型,如 `1` `Object(1)`
 * 3. 无效日期对象,如 `new Date('')` `new Date('abc')`
 *
 * @alias module:Language.isEqual
 * @since 1.3.0
 * @param {*} value 要比较的值。
 * @param {*} other 另一个要比较的值。
 * @param {Function} [customizer] 自定义比较。
 * @param {boolean} [strictCheck=false] 严格比较。默认 `false`。
 * @returns {boolean} 如果两个值相等,返回 `true`,否则返回 `false`。
 * @example
 *
 * const value = { a: 1, b: -0 }
 * const other = { a: 1, b: 0 }
 *
 * isEqual(value, other); // true
 * value === other // false
 *
 * // 严格比较
 * isEqual(value, other, undefined, true); // false
 *
 * // 自定义比较
 * function customizer(value, other){
 *   if(typeof value === 'string' && typeof other === 'string'){
 *     return true;
 *   }
 * }
 * isEqual('a', 'b', customizer); // true
 * isEqual(['a'], ['b'], customizer); // true
 * isEqual({foo: 'a'}, {foo: 'b'}, customizer); // true
 *
 */
function isEqual(value, other, customizer, strictCheck = false) {
    // 自定义比较
    if (typeof customizer === 'function') {
        const result = customizer(value, other);
        if (result !== nativeUndefined) {
            return !!result;
        }
    }
    return isEqualDeep(value, other, customizer, strictCheck);
}
export default isEqual;