Skip to content

Commit 96ab1bc

Browse files
committedNov 24, 2018
Support enumerable symbol properties in deepEqual()
1 parent 6350261 commit 96ab1bc

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed
 

‎lib/deep-equal.js

+31-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ internals.isSetSimpleEqual = function (obj, ref) {
116116
internals.isDeepEqualObj = function (instanceType, obj, ref, options, seen) {
117117

118118
const { isDeepEqual, valueOf, hasOwnEnumerableProperty } = internals;
119-
const { keys } = Object;
119+
const { keys, getOwnPropertySymbols } = Object;
120120

121121
if (instanceType === internals.arrayType) {
122122
if (options.part) {
@@ -226,6 +226,36 @@ internals.isDeepEqualObj = function (instanceType, obj, ref, options, seen) {
226226
}
227227
}
228228

229+
// Check symbols
230+
231+
const objSymbols = getOwnPropertySymbols(obj);
232+
const refSymbols = new Set(getOwnPropertySymbols(ref));
233+
234+
for (let i = 0; i < objSymbols.length; ++i) {
235+
const key = objSymbols[i];
236+
237+
if (hasOwnEnumerableProperty(obj, key)) {
238+
if (!hasOwnEnumerableProperty(ref, key)) {
239+
return false;
240+
}
241+
242+
if (!isDeepEqual(obj[key], ref[key], options, seen)) {
243+
return false;
244+
}
245+
}
246+
else if (hasOwnEnumerableProperty(ref, key)) {
247+
return false;
248+
}
249+
250+
refSymbols.delete(key);
251+
}
252+
253+
for (const key of refSymbols) {
254+
if (hasOwnEnumerableProperty(ref, key)) {
255+
return false;
256+
}
257+
}
258+
229259
return true;
230260
};
231261

‎test/index.js

+21
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,27 @@ describe('deepEqual()', () => {
10831083
compare();
10841084
});
10851085

1086+
it('compares symbol object properties', () => {
1087+
1088+
const sym = Symbol();
1089+
1090+
const ne = {};
1091+
Object.defineProperty(ne, sym, { value: true });
1092+
1093+
expect(Hoek.deepEqual({ [sym]: { c: true } }, { [sym]: { c: true } })).to.be.true();
1094+
expect(Hoek.deepEqual({ [sym]: { c: true } }, { [sym]: { c: false } })).to.be.false();
1095+
expect(Hoek.deepEqual({ [sym]: { c: true } }, { [sym]: true })).to.be.false();
1096+
expect(Hoek.deepEqual({ [sym]: undefined }, { [sym]: undefined })).to.be.true();
1097+
expect(Hoek.deepEqual({ [sym]: undefined }, {})).to.be.false();
1098+
expect(Hoek.deepEqual({}, { [sym]: undefined })).to.be.false();
1099+
1100+
expect(Hoek.deepEqual({}, ne)).to.be.true();
1101+
expect(Hoek.deepEqual(ne, {})).to.be.true();
1102+
expect(Hoek.deepEqual({ [sym]: true }, ne)).to.be.false();
1103+
expect(Hoek.deepEqual(ne, { [sym]: true })).to.be.false();
1104+
expect(Hoek.deepEqual(ne, { [Symbol()]: undefined })).to.be.false();
1105+
});
1106+
10861107
it('compares dates', () => {
10871108

10881109
expect(Hoek.deepEqual(new Date(2015, 1, 1), new Date('2015/02/01'))).to.be.true();

0 commit comments

Comments
 (0)
Please sign in to comment.