equalArrayLike.js

import eq from './eq';
import isArrayLike from './isArrayLike';
/**
 * 比较两个类数组的值是否相等。常用于参数对象比较。
 *
 * 1. 如果两个值相等,返回 `true`。
 * 2. 如果两个类数组 `length` 相等,且遍历每个值都相等,则返回 `true`。
 * 3. 否则返回 `false`。
 *
 * @alias module:Util.equalArrayLike
 * @since 1.18.0
 * @param {Array} arg1 类数组1。
 * @param {Array} arg2 类数组2。
 * @param {boolean} [strictCheck=true] 严格比较,如果为 `true` 表示区分 `0` 和 `-0`。默认 `true`。
 * @returns 是否相等。
 * @example
 * equalArrayLike([1, 2], [1, 2]); // true
 * equalArrayLike([1, 2], [1, 3]); // false
 * equalArrayLike([1, 2], [1, 2, 3]); // false
 *
 * // 松散比较
 * equalArrayLike(['a', 'b'], 'ab'); // true
 * equalArrayLike(['a', 'b'], { 0: 'a', 1: 'b', length: 2 }); // true
 *
 * // 两个相等值返回 true
 * equalArrayLike(NaN, NaN); // true
 * equalArrayLike(null, null); // true
 * equalArrayLike(undefined, undefined); // true
 * const obj1 = {};
 * const obj2 = obj1;
 * equalArrayLike(obj1, obj2); // true
 *
 * // 0 和 -0 严格比较返回 false
 * equalArrayLike([0, -0], [-0, 0]); // false
 * // 非严格比较返回 true
 * equalArrayLike([0, -0], [-0, 0], false); // true
 */
function equalArrayLike(arg1, arg2, strictCheck = true) {
    if (eq(arg1, arg2, strictCheck))
        return true;
    if (!isArrayLike(arg1) || !isArrayLike(arg2))
        return false;
    if (arg1.length !== arg2.length)
        return false;
    for (let i = 0; i < arg1.length; i++) {
        if (!eq(arg1[i], arg2[i], strictCheck))
            return false;
    }
    return true;
}
export default equalArrayLike;