shallowEqual.js

import eq from './eq';
import { objectProtoHasOwnProperty } from './internals/native';
/**
 * 浅比较两个值是否相等。常用于参数对象比较。
 *
 * 1. 如果两个值相等,返回 `true`。
 * 2. 如果两个对象属性数量相等,且遍历每个属性值都相等,则返回 `true`。
 * 3. 否则返回 `false`。
 *
 * @alias module:Util.shallowEqual
 * @since 1.21.0
 * @param {Array} objA 要比较的值。。
 * @param {Array} objB 另一个要比较的值。
 * @param {boolean} [strictCheck=true] 严格比较,如果为 `true` 表示区分 `0` 和 `-0`。默认 `true`。
 * @returns 浅比较两个值是否相等。
 * @example
 * shallowEqual({ a: 1, b: 2 }, { a: 1, b: 2 }); // true
 * shallowEqual({ a: 1, b: 2 }, { a: 1, b: 3 }); // false
 *
 * shallowEqual([1, 2], [1, 2]); // true
 * shallowEqual([1, 2], [1, 3]); // false
 * shallowEqual([1, 2], [1, 2, 3]); // false
 *
 * // 两个相等值返回 true
 * shallowEqual(1, 1); // true
 * shallowEqual('foo', 'foo'); // true
 * shallowEqual(NaN, NaN); // true
 * shallowEqual(null, null); // true
 * shallowEqual(undefined, undefined); // true
 * const obj1 = {};
 * const obj2 = obj1;
 * shallowEqual(obj1, obj2); // true
 *
 * // 默认严格比较,区分 0 和 -0
 * shallowEqual([0, -0], [-0, 0]); // false
 *
 * // 非严格比较,不区分 0 和 -0
 * shallowEqual([0, -0], [-0, 0], false); // true
 */
function shallowEqual(objA, objB, strictCheck = true) {
    // 检查两个对象是否为同一个引用
    if (eq(objA, objB, strictCheck)) {
        return true;
    }
    // 检查是否为对象类型
    if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
        return false;
    }
    const keysA = Object.keys(objA);
    const keysB = Object.keys(objB);
    // 检查属性数量是否相同
    if (keysA.length !== keysB.length) {
        return false;
    }
    // 遍历属性,检查属性值是否相同
    for (let i = 0; i < keysA.length; i++) {
        const key = keysA[i];
        if (!objectProtoHasOwnProperty.call(objB, key) || !eq(objA[key], objB[key], strictCheck)) {
            return false;
        }
    }
    return true;
}
export default shallowEqual;