'use strict'; module.exports = function equal(a, b){ if (a === b) return true ; if (a && b && typeof a == 'object' && typeof b == 'object') { if (a.constructor !== b.constructor) return false ; var length, i, keys; if (Array.isArray(a)) { length = _AN_Read_length('length', a); if (length != _AN_Read_length('length', b)) return false ; for (i = length; i-- !== 0; )if (!equal(a[i], b[i])) return false ; return true ; } if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); keys = Object.keys(a); length = _AN_Read_length('length', keys); if (length !== _AN_Read_length('length', Object.keys(b))) return false ; for (i = length; i-- !== 0; )if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false ; for (i = length; i-- !== 0; ){ var key = keys[i]; if (!equal(a[key], b[key])) return false ; } return true ; } return a !== a && b !== b; } ;