深拷贝clone实现和比较两个对象是否相等的封装

1,079 阅读1分钟

使用ES6实现对象深拷贝和判断两个对象是否相等

1、deepClone

export function deepClone(value) {
    if (Array.isArray(value)) {
        return value.map(deepClone)
    } else if (value && typeof value === 'object') {
        var res = {};
        for (var key in value) {
            res[key] = value[key]
        }
        return res
    } else {
        return value
    }
}

这是vue源码中实现深拷贝的方式,使用map函数

2、判断两个对象事都完全相等的方式

export function isObjectEqual(a, b) {

    if (a === void 0) a = {};
    if (b === void 0) b = {};
    // 如果两个值都是布尔值的话进行判断
    if (!a || !b) { return a === b }
    // 将对象中的键存在数组中,然后根据数组的长度来判断是否有相同的数量的键值对。
    var akeys = Object.keys(a)
    var bkeys = Object.keys(b)
    if (akeys.length !== bkeys.length) {
        return false;
    }
    // 使用every循环进行值得比较
    return akeys.every(function(key) {
        var aVal = a[key];
        var bVal = b[key];
        // 如果是深层次得对象或者数组继续递归调用
        if (typeof aVal === 'object' && typeof bVal === 'object') {
            return isObjectEqual(aVal, bVal)
        }
        // 如果不是对象或者数组得话,是字符串。则直接进行比较
        return String(aVal) === String(bVal)
    })
}
在浏览器中已经自测飞行那个好用