/*! * UI development toolkit for HTML5 (OpenUI5) * (c) Copyright 2009-2018 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ /*global Node */ //@evo-todo check isEqualNode dependency: not yet available... //@evo-todo dependency to global name 'Node' contradicts sap/base package sap.ui.define(["sap/base/Log"], function(Log) { "use strict"; /** * Compares the two given values for equality, especially by comparing the content. * Note: function does not work with comparing XML objects * * @function * @since 1.58 * @param {any} a A value of any type * @param {any} b A value of any type * @param {int} [maxDepth=10] Maximum recursion depth * @param {boolean} [contains] Whether all existing properties in a are equal as in b * @alias module:sap/base/util/deepEqual * @return {boolean} Whether a and b are equal * @public */ var fnEqual = function(a, b, maxDepth, contains, depth) { // Optional parameter normalization if (typeof maxDepth == "boolean") { contains = maxDepth; maxDepth = undefined; } if (!depth) { depth = 0; } if (!maxDepth) { maxDepth = 10; } if (depth > maxDepth) { Log.warning("deepEqual comparison exceeded maximum recursion depth of " + maxDepth + ". Treating values as unequal"); return false; } if (a === b) { return true; } // Number.isNaN is not supported by IE11, so we need to fall back on the verbose implementation var bIsReallyNaN = (typeof a === "number" && typeof b === "number" && isNaN(a) && isNaN(b)); if (bIsReallyNaN) { return true; } if (Array.isArray(a) && Array.isArray(b)) { if (!contains && a.length !== b.length) { return false; } if (a.length > b.length) { return false; } for (var i = 0; i < a.length; i++) { if (!fnEqual(a[i], b[i], maxDepth, contains, depth + 1)) { return false; } } return true; } if (typeof a == "object" && typeof b == "object") { if (!a || !b) { return false; } if (a.constructor !== b.constructor) { return false; } if (!contains && Object.keys(a).length !== Object.keys(b).length) { return false; } if (a instanceof Node) { return a.isEqualNode(b); } if (a instanceof Date) { return a.valueOf() === b.valueOf(); } for (var i in a) { if (!fnEqual(a[i], b[i], maxDepth, contains, depth + 1)) { return false; } } return true; } return false; }; return fnEqual; });