deepVerificationObject(newObj, oldObj) {
let i, l, leftChain, rightChain;
function compareObjectDifferences(newObj, oldObj) {
let p;
if (isNaN(newObj) && isNaN(oldObj) && typeof newObj === 'number' && typeof oldObj === 'number') {
return true;
}
if (newObj === oldObj) {
return true;
}
if ((typeof newObj === 'function' && typeof oldObj === 'function') ||
(newObj instanceof Date && oldObj instanceof Date) ||
(newObj instanceof RegExp && oldObj instanceof RegExp) ||
(newObj instanceof String && oldObj instanceof String) ||
(newObj instanceof Number && oldObj instanceof Number)) {
return newObj.toString() === oldObj.toString();
}
if (!(newObj instanceof Object && oldObj instanceof Object)) {
return false;
}
if (newObj.isPrototypeOf(oldObj) || oldObj.isPrototypeOf(newObj)) {
return false;
}
if (newObj.constructor !== oldObj.constructor) {
return false;
}
if (newObj.prototype !== oldObj.prototype) {
return false;
}
if (leftChain.indexOf(newObj) > -1 || rightChain.indexOf(oldObj) > -1) {
return false;
}
for (p in oldObj) {
if (oldObj.hasOwnProperty(p) !== newObj.hasOwnProperty(p)) {
return false;
} else if (typeof oldObj[p] !== typeof newObj[p]) {
return false;
}
}
for (p in newObj) {
if (oldObj.hasOwnProperty(p) !== newObj.hasOwnProperty(p)) {
return false;
} else if (typeof oldObj[p] !== typeof newObj[p]) {
return false;
}
switch (typeof(newObj[p])) {
case 'object':
case 'function':
leftChain.push(newObj);
rightChain.push(oldObj);
if (!compareObjectDifferences(newObj[p], oldObj[p])) {
return false;
}
leftChain.pop();
rightChain.pop();
break;
default:
if (newObj[p] !== oldObj[p]) {
return false;
}
break;
}
}
return true;
}
if (arguments.length < 1) {
return true;
}
for (i = 1, l = arguments.length; i < l; i++) {
leftChain = [];
rightChain = [];
if (!compareObjectDifferences(arguments[0], arguments[i])) {
return false;
}
}
return true;
}