| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | "use strict";var eq            = require("./eq")  , isPlainObject = require("./is-plain-object")  , value         = require("./valid-value");var isArray = Array.isArray  , keys = Object.keys  , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable  , objHasOwnProperty = Object.prototype.hasOwnProperty  , eqArr  , eqVal  , eqObj;eqArr = function (arr1, arr2, recMap) {	var i, length = arr1.length;	if (length !== arr2.length) return false;	for (i = 0; i < length; ++i) {		if (objHasOwnProperty.call(arr1, i) !== objHasOwnProperty.call(arr2, i)) return false;		if (!eqVal(arr1[i], arr2[i], recMap)) return false;	}	return true;};eqObj = function (obj1, obj2, recMap) {	var k1 = keys(obj1), k2 = keys(obj2);	if (k1.length !== k2.length) return false;	return k1.every(function (key) {		if (!objPropertyIsEnumerable.call(obj2, key)) return false;		return eqVal(obj1[key], obj2[key], recMap);	});};eqVal = function (val1, val2, recMap) {	var i, eqX, c1, c2;	if (eq(val1, val2)) return true;	if (isPlainObject(val1)) {		if (!isPlainObject(val2)) return false;		eqX = eqObj;	} else if (isArray(val1) && isArray(val2)) {		eqX = eqArr;	} else {		return false;	}	c1 = recMap[0];	c2 = recMap[1];	i = c1.indexOf(val1);	if (i === -1) {		i = c1.push(val1) - 1;		c2[i] = [];	} else if (c2[i].indexOf(val2) !== -1) return true;	c2[i].push(val2);	return eqX(val1, val2, recMap);};module.exports = function (val1, val2) {	if (eq(value(val1), value(val2))) return true;	return eqVal(Object(val1), Object(val2), [[], []]);};
 |