123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- var objectKeys = require('object-keys');
- var isArguments = require('is-arguments');
- var is = require('object-is');
- var isRegex = require('is-regex');
- var flags = require('regexp.prototype.flags');
- var isDate = require('is-date-object');
- var getTime = Date.prototype.getTime;
- function deepEqual(actual, expected, options) {
- var opts = options || {};
-
- if (opts.strict ? is(actual, expected) : actual === expected) {
- return true;
- }
-
- if (!actual || !expected || (typeof actual !== 'object' && typeof expected !== 'object')) {
- return opts.strict ? is(actual, expected) : actual == expected;
- }
-
-
- return objEquiv(actual, expected, opts);
- }
- function isUndefinedOrNull(value) {
- return value === null || value === undefined;
- }
- function isBuffer(x) {
- if (!x || typeof x !== 'object' || typeof x.length !== 'number') {
- return false;
- }
- if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
- return false;
- }
- if (x.length > 0 && typeof x[0] !== 'number') {
- return false;
- }
- return true;
- }
- function objEquiv(a, b, opts) {
-
- var i, key;
- if (typeof a !== typeof b) { return false; }
- if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) { return false; }
-
- if (a.prototype !== b.prototype) { return false; }
- if (isArguments(a) !== isArguments(b)) { return false; }
- var aIsRegex = isRegex(a);
- var bIsRegex = isRegex(b);
- if (aIsRegex !== bIsRegex) { return false; }
- if (aIsRegex || bIsRegex) {
- return a.source === b.source && flags(a) === flags(b);
- }
- if (isDate(a) && isDate(b)) {
- return getTime.call(a) === getTime.call(b);
- }
- var aIsBuffer = isBuffer(a);
- var bIsBuffer = isBuffer(b);
- if (aIsBuffer !== bIsBuffer) { return false; }
- if (aIsBuffer || bIsBuffer) {
- if (a.length !== b.length) { return false; }
- for (i = 0; i < a.length; i++) {
- if (a[i] !== b[i]) { return false; }
- }
- return true;
- }
- if (typeof a !== typeof b) { return false; }
- try {
- var ka = objectKeys(a);
- var kb = objectKeys(b);
- } catch (e) {
- return false;
- }
-
- if (ka.length !== kb.length) { return false; }
-
- ka.sort();
- kb.sort();
-
- for (i = ka.length - 1; i >= 0; i--) {
- if (ka[i] != kb[i]) { return false; }
- }
-
- for (i = ka.length - 1; i >= 0; i--) {
- key = ka[i];
- if (!deepEqual(a[key], b[key], opts)) { return false; }
- }
- return true;
- }
- module.exports = deepEqual;
|