比较两个array或者object是否深度相等
function objectEquals(object1: Object, object2: Object): boolean { for (let propName in object1) { if (object1.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) { return false } else if (typeof object1[propName] != typeof object2[propName]) { return false } } for (let propName in object2) { if (object1.hasOwnProperty(propName) != object2.hasOwnProperty(propName)) { return false } else if (typeof object1[propName] != typeof object2[propName]) { return false } if (!object1.hasOwnProperty(propName)) { continue } if (object1[propName] instanceof Array && object2[propName] instanceof Array) { if (!arrayEquals(object1[propName], object2[propName])) { return false } } else if (object1[propName] instanceof Object && object2[propName] instanceof Object) { if (!objectEquals(object1[propName], object2[propName])) { return false } } else if (object1[propName] != object2[propName]) { return false } } return true } function arrayEquals(array1, array2): boolean { if (!array1 && !array2) { return true } if (!array1 && array2 || array1 && !array2) { return false } if (array1.length != array2.length) { return false } for (let i = 0, l = array1.length; i < l; i++) { if (array1[i] instanceof Array && array2[i] instanceof Array) { if (!arrayEquals(array1[i], array2[i])) return false } else if (array1[i] instanceof Object && array2[i] instanceof Object) { if (!objectEquals(array1[i], array2[i])) return false } else if (array1[i] != array2[i]) { return false } } return true }