function deepEquals (val1, val2) {
if (Number.isNaN(val1) && Number.isNaN(val2)) return true;
let valIsObject = function (val) {
return typeof val === 'object' && val !== null;
}
if (!valIsObject(val1) || !valIsObject(val2)) return val1 === val2;
if (val1 === val2) return true;
let isEmptyObj = (Array.isArray(val1) && !Array.isArray(val2)) || (Array.isArray(val2) && !Array.isArray(val1));
if (isEmptyObj) return false;
if (Object.keys(val1).length !== Object.keys(val2).length) return false;
for (let key in val1) {
if (val1.hasOwnProperty(key)) {
const isEqual = deepEquals(val1[key], val2[key])
if (!isEqual) return isEqual;
}
}
return true;
}