1
1
'use strict' ;
2
2
3
3
const {
4
+ Array,
5
+ ArrayBuffer,
4
6
ArrayIsArray,
5
7
ArrayPrototypeFilter,
6
8
ArrayPrototypePush,
9
+ BigInt,
10
+ BigInt64Array,
7
11
BigIntPrototypeValueOf,
12
+ BigUint64Array,
13
+ Boolean,
8
14
BooleanPrototypeValueOf,
15
+ DataView,
16
+ Date,
9
17
DatePrototypeGetTime,
10
18
Error,
19
+ Float16Array,
20
+ Float32Array,
21
+ Float64Array,
22
+ Function,
23
+ Int16Array,
24
+ Int32Array,
25
+ Int8Array,
26
+ Map,
27
+ Number,
11
28
NumberPrototypeValueOf,
29
+ Object,
12
30
ObjectGetOwnPropertyDescriptor,
13
31
ObjectGetOwnPropertySymbols : getOwnSymbols ,
14
32
ObjectGetPrototypeOf,
@@ -17,18 +35,65 @@ const {
17
35
ObjectPrototypeHasOwnProperty : hasOwn ,
18
36
ObjectPrototypePropertyIsEnumerable : hasEnumerable ,
19
37
ObjectPrototypeToString,
38
+ Promise,
39
+ RegExp,
20
40
SafeSet,
41
+ Set,
42
+ SharedArrayBuffer,
43
+ String,
21
44
StringPrototypeValueOf,
45
+ Symbol,
22
46
SymbolPrototypeValueOf,
23
47
TypedArrayPrototypeGetByteLength : getByteLength ,
24
48
TypedArrayPrototypeGetSymbolToStringTag,
49
+ Uint16Array,
50
+ Uint32Array,
25
51
Uint8Array,
52
+ Uint8ClampedArray,
53
+ WeakMap,
54
+ WeakSet,
26
55
} = primordials ;
27
56
28
57
const { compare } = internalBinding ( 'buffer' ) ;
29
58
const assert = require ( 'internal/assert' ) ;
30
59
const { isURL } = require ( 'internal/url' ) ;
31
60
const { isError } = require ( 'internal/util' ) ;
61
+ const { Buffer } = require ( 'buffer' ) ;
62
+
63
+ const wellKnownConstructors = new SafeSet ( ) ;
64
+ wellKnownConstructors . add ( Array ) ;
65
+ wellKnownConstructors . add ( ArrayBuffer ) ;
66
+ wellKnownConstructors . add ( BigInt ) ;
67
+ wellKnownConstructors . add ( BigInt64Array ) ;
68
+ wellKnownConstructors . add ( BigUint64Array ) ;
69
+ wellKnownConstructors . add ( Boolean ) ;
70
+ wellKnownConstructors . add ( Buffer ) ;
71
+ wellKnownConstructors . add ( DataView ) ;
72
+ wellKnownConstructors . add ( Date ) ;
73
+ wellKnownConstructors . add ( Error ) ;
74
+ wellKnownConstructors . add ( Float16Array ) ;
75
+ wellKnownConstructors . add ( Float32Array ) ;
76
+ wellKnownConstructors . add ( Float64Array ) ;
77
+ wellKnownConstructors . add ( Function ) ;
78
+ wellKnownConstructors . add ( Int16Array ) ;
79
+ wellKnownConstructors . add ( Int32Array ) ;
80
+ wellKnownConstructors . add ( Int8Array ) ;
81
+ wellKnownConstructors . add ( Map ) ;
82
+ wellKnownConstructors . add ( Number ) ;
83
+ wellKnownConstructors . add ( Object ) ;
84
+ wellKnownConstructors . add ( Promise ) ;
85
+ wellKnownConstructors . add ( RegExp ) ;
86
+ wellKnownConstructors . add ( Set ) ;
87
+ wellKnownConstructors . add ( SharedArrayBuffer ) ;
88
+ wellKnownConstructors . add ( String ) ;
89
+ wellKnownConstructors . add ( Symbol ) ;
90
+ wellKnownConstructors . add ( Uint16Array ) ;
91
+ wellKnownConstructors . add ( Uint32Array ) ;
92
+ wellKnownConstructors . add ( Uint8Array ) ;
93
+ wellKnownConstructors . add ( Uint8ClampedArray ) ;
94
+ wellKnownConstructors . add ( WeakMap ) ;
95
+ wellKnownConstructors . add ( WeakSet ) ;
96
+
32
97
const types = require ( 'internal/util/types' ) ;
33
98
const {
34
99
isAnyArrayBuffer,
@@ -198,11 +263,20 @@ function innerDeepEqual(val1, val2, mode, memos) {
198
263
}
199
264
200
265
function objectComparisonStart ( val1 , val2 , mode , memos ) {
201
- if ( mode === kStrict &&
202
- ( val1 . constructor !== val2 . constructor ||
203
- ( val1 . constructor === undefined &&
204
- ObjectGetPrototypeOf ( val1 ) !== ObjectGetPrototypeOf ( val2 ) ) ) ) {
205
- return false ;
266
+ if ( mode === kStrict ) {
267
+ if ( wellKnownConstructors . has ( val1 . constructor ) ) {
268
+ if ( val1 . constructor !== val2 . constructor ) {
269
+ return false ;
270
+ }
271
+ } else if ( hasOwn ( val1 , 'constructor' ) ) {
272
+ if ( ObjectGetPrototypeOf ( val1 ) !== ObjectGetPrototypeOf ( val2 ) ) {
273
+ return false ;
274
+ }
275
+ } else if ( ( val1 . constructor !== val2 . constructor ||
276
+ ( val1 . constructor === undefined &&
277
+ ObjectGetPrototypeOf ( val1 ) !== ObjectGetPrototypeOf ( val2 ) ) ) ) {
278
+ return false ;
279
+ }
206
280
}
207
281
208
282
const val1Tag = ObjectPrototypeToString ( val1 ) ;
0 commit comments