<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script>
<script src="https://unpkg.com/dequal@2.0.2/dist/index.min.js"></script>
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 = a.length;
if (length != b.length) 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 = keys.length;
if (length !== Object.keys(b).length) 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;
}
// true if both NaN, false otherwise
return a!==a && b!==b;
};
// 1 level deep
var data = [
{
description: 'equal numbers',
value1: 1,
value2: 1,
equal: true,
},
{
description: 'not equal numbers',
value1: 1,
value2: 2,
equal: false,
},
{
description: 'number and array are not equal',
value1: 1,
value2: [],
equal: false,
},
{
description: '0 and null are not equal',
value1: 0,
value2: null,
equal: false,
},
{
description: 'equal strings',
value1: 'a',
value2: 'a',
equal: true,
},
{
description: 'big object',
value1: {
prop1: 'value1',
prop2: 'value2',
prop3: 'value3',
prop4: {
subProp1: 'sub value1',
subProp2: {
subSubProp1: 'sub sub value1',
subSubProp2: [
1,
2,
{ prop2: 1, prop: 2 },
4,
5,
],
},
},
prop5: 1000,
prop6: new Date(2016, 2, 10),
},
value2: {
prop5: 1000,
prop3: 'value3',
prop1: 'value1',
prop2: 'value2',
prop6: new Date('2016/03/10'),
prop4: {
subProp2: {
subSubProp1: 'sub sub value1',
subSubProp2: [
1,
2,
{ prop2: 1, prop: 2 },
4,
5,
],
},
subProp1: 'sub value1',
},
},
equal: true,
},
];
data.forEach((item) => {
_.isEqual(item.value1, item.value2);
});
data.forEach((item) => {
dequal.dequal(item.value1, item.value2);
});
--enable-precise-memory-info
flag.
Test case name | Result |
---|---|
lodash.isEqual | |
dequal |
Test name | Executions per second |
---|---|
lodash.isEqual | 176638.6 Ops/sec |
dequal | 409655.7 Ops/sec |
I'll explain the benchmark and its results in detail.
Benchmark Overview
The benchmark compares the performance of two JavaScript libraries: Lodash's isEqual
function and Dequal. The benchmark consists of 7 test cases, each testing a different scenario for equality checking.
Options Compared
Two options are being compared:
isEqual
function: This is a general-purpose equality checking function that can handle various data types, including objects, arrays, numbers, and strings.Pros and Cons
isEqual
function:Other Considerations
Both libraries have different approaches to handling certain data types:
isEqual
function will recursively compare object properties, while Dequal uses a simple reference check.Test Case Explanation
Each test case consists of a single JavaScript statement that calls either the isEqual
function or the dequal
function on a specific data value. The data values are defined in the benchmark's script preparation code.
null
.Library Descriptions
isEqual
function is one of its many useful tools.Benchmark Results
The latest benchmark results show that:
isEqual
function in terms of execution speed.Keep in mind that these results may vary depending on the specific use case and environment.