function deepEqual(obj1, obj2) {
			var a = obj1;
			b = obj2;
			if (a === b) {
				return true;
			} else if (a && b && (typeof a === 'undefined' ? 'undefined' : _typeof(a)) === 'object' && (typeof b === 'undefined' ? 'undefined' : _typeof(b)) === 'object') {
				var arrA = isArray(a),
				    arrB = isArray(b);
				var i = void 0,
				    length = void 0,
				    key = void 0;

				if (arrA && arrB) {
					length = a.length;
					if (length !== b.length) {
						return false;
					}
					for (i = length; i-- !== 0;) {
						if (!deepEqual(a[i], b[i])) {
							return false;
						}
					}
					return true;
				}

				if (arrA !== arrB) {
					return false;
				}

				var dateA = isDate(a),
				    dateB = isDate(b);

				if (dateA !== dateB) {
					return false;
				}
				if (dateA && dateB) {
					return a.getTime() == b.getTime();
				}

				var regexpA = isRegExp(a),
				    regexpB = isRegExp(b);

				if (regexpA !== regexpB) {
					return false;
				}
				if (regexpA && regexpB) {
					return a.toString() === b.toString();
				}

				var keys1 = keys(a);
				length = keys1.length;

				if (length !== keys(b).length) {
					return false;
				}
				for (i = length; i-- !== 0;) {
					if (!_hasOwnProperty.call(b, keys1[i])) {
						return false;
					}
				}
				for (i = length; i-- !== 0;) {
					key = keys1[i];
					if (!deepEqual(a[key], b[key])) {
						return false;
					}
				}
				if (a.__proto__ !== b.__proto__) {
					return false;
				}

				return true;
			}

			return a !== a && b !== b;
		}
/**
   * Tests if the properties of an object are equal, recursively.
   * @param {*} obj1 The first object to compare
   * @param {*} obj2 The second object to compate
   * @returns {boolean} Whether the objects are equal
   * @memberof XtraUtils.Object#
   */
Tests if the properties of an object are equal, recursively.
@param {*} obj1 The first object to compare
@param {*} obj2 The second object to compate
@returns {boolean} Whether the objects are equal
@memberof XtraUtils.Object
Tests if the properties of an object are equal recursively . @param { * } obj1 The first object to compare @param { * } obj2 The second object to compate @returns { boolean } Whether the objects are equal @memberof XtraUtils . Object
function deepEqual(obj1, obj2) {
			var a = obj1;
			b = obj2;
			if (a === b) {
				return true;
			} else if (a && b && (typeof a === 'undefined' ? 'undefined' : _typeof(a)) === 'object' && (typeof b === 'undefined' ? 'undefined' : _typeof(b)) === 'object') {
				var arrA = isArray(a),
				    arrB = isArray(b);
				var i = void 0,
				    length = void 0,
				    key = void 0;
				if (arrA && arrB) {
					length = a.length;
					if (length !== b.length) {
						return false;
					}
					for (i = length; i-- !== 0;) {
						if (!deepEqual(a[i], b[i])) {
							return false;
						}
					}
					return true;
				}
				if (arrA !== arrB) {
					return false;
				}
				var dateA = isDate(a),
				    dateB = isDate(b);
				if (dateA !== dateB) {
					return false;
				}
				if (dateA && dateB) {
					return a.getTime() == b.getTime();
				}
				var regexpA = isRegExp(a),
				    regexpB = isRegExp(b);
				if (regexpA !== regexpB) {
					return false;
				}
				if (regexpA && regexpB) {
					return a.toString() === b.toString();
				}
				var keys1 = keys(a);
				length = keys1.length;
				if (length !== keys(b).length) {
					return false;
				}
				for (i = length; i-- !== 0;) {
					if (!_hasOwnProperty.call(b, keys1[i])) {
						return false;
					}
				}
				for (i = length; i-- !== 0;) {
					key = keys1[i];
					if (!deepEqual(a[key], b[key])) {
						return false;
					}
				}
				if (a.__proto__ !== b.__proto__) {
					return false;
				}
				return true;
			}
			return a !== a && b !== b;
		}
function deepEqual ( obj1 , obj2 ) { var a = obj1 ; b = obj2 ; if ( a === b ) { return true ; } else if ( a && b && ( typeof a === 'undefined' ? 'undefined' : _typeof ( a ) ) === 'object' && ( typeof b === 'undefined' ? 'undefined' : _typeof ( b ) ) === 'object' ) { var arrA = isArray ( a ) , arrB = isArray ( b ) ; var i = void 0 , length = void 0 , key = void 0 ; if ( arrA && arrB ) { length = a . length ; if ( length !== b . length ) { return false ; } for ( i = length ; i -- !== 0 ; ) { if ( ! deepEqual ( a [ i ] , b [ i ] ) ) { return false ; } } return true ; } if ( arrA !== arrB ) { return false ; } var dateA = isDate ( a ) , dateB = isDate ( b ) ; if ( dateA !== dateB ) { return false ; } if ( dateA && dateB ) { return a . getTime ( ) == b . getTime ( ) ; } var regexpA = isRegExp ( a ) , regexpB = isRegExp ( b ) ; if ( regexpA !== regexpB ) { return false ; } if ( regexpA && regexpB ) { return a . toString ( ) === b . toString ( ) ; } var keys1 = keys ( a ) ; length = keys1 . length ; if ( length !== keys ( b ) . length ) { return false ; } for ( i = length ; i -- !== 0 ; ) { if ( ! _hasOwnProperty . call ( b , keys1 [ i ] ) ) { return false ; } } for ( i = length ; i -- !== 0 ; ) { key = keys1 [ i ] ; if ( ! deepEqual ( a [ key ] , b [ key ] ) ) { return false ; } } if ( a . __proto__ !== b . __proto__ ) { return false ; } return true ; } return a !== a && b !== b ; }
Tests if the properties of an object are equal, recursively.
Tests if the properties of an object are equal recursively .