Skip to content

Commit 312d13d

Browse files
committed
Fall back to instanceof if ObjectToString is unreliable
1 parent 4d6dc59 commit 312d13d

File tree

1 file changed

+79
-7
lines changed

1 file changed

+79
-7
lines changed

support/types.js

Lines changed: 79 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,39 +184,111 @@ function isBigUint64Array(value) {
184184
}
185185
exports.isBigUint64Array = isBigUint64Array;
186186

187-
function isMap(value) {
187+
function isMapToString(value) {
188188
return ObjectToString(value) === '[object Map]';
189189
}
190+
isMapToString.working = typeof Map !== 'undefined' && isMapToString(new Map());
191+
192+
function isMap(value) {
193+
if (typeof Map === 'undefined') {
194+
return false;
195+
}
196+
197+
return isMapToString.working
198+
? isMapToString(value)
199+
: value instanceof Map;
200+
}
190201
exports.isMap = isMap;
191202

192-
function isSet(value) {
203+
function isSetToString(value) {
193204
return ObjectToString(value) === '[object Set]';
194205
}
206+
isSetToString.working = typeof Set !== 'undefined' && isSetToString(new Set());
207+
function isSet(value) {
208+
if (typeof Set === 'undefined') {
209+
return false;
210+
}
211+
212+
return isSetToString.working
213+
? isSetToString(value)
214+
: value instanceof Set;
215+
}
195216
exports.isSet = isSet;
196217

197-
function isWeakMap(value) {
218+
function isWeakMapToString(value) {
198219
return ObjectToString(value) === '[object WeakMap]';
199220
}
221+
isWeakMapToString.working = typeof WeakMap !== 'undefined' && isWeakMapToString(new WeakMap());
222+
function isWeakMap(value) {
223+
if (typeof WeakMap === 'undefined') {
224+
return false;
225+
}
226+
227+
return isWeakMapToString.working
228+
? isWeakMapToString(value)
229+
: value instanceof WeakMap;
230+
}
200231
exports.isWeakMap = isWeakMap;
201232

202-
function isWeakSet(value) {
233+
function isWeakSetToString(value) {
203234
return ObjectToString(value) === '[object WeakSet]';
204235
}
236+
isWeakSetToString.working = typeof WeakSet !== 'undefined' && isWeakSetToString(new WeakSet());
237+
function isWeakSet(value) {
238+
return isWeakSetToString(value);
239+
if (typeof WeakSet === 'undefined') {
240+
return false;
241+
}
242+
243+
return isWeakSetToString.working
244+
? isWeakSetToString(value)
245+
: value instanceof WeakSet;
246+
}
205247
exports.isWeakSet = isWeakSet;
206248

207-
function isArrayBuffer(value) {
249+
function isArrayBufferToString(value) {
208250
return ObjectToString(value) === '[object ArrayBuffer]';
209251
}
252+
isArrayBufferToString.working = typeof ArrayBuffer !== 'undefined' && isArrayBufferToString(new ArrayBuffer());
253+
function isArrayBuffer(value) {
254+
if (typeof ArrayBuffer === 'undefined') {
255+
return false;
256+
}
257+
258+
return isArrayBufferToString.working
259+
? isArrayBufferToString(value)
260+
: value instanceof ArrayBuffer;
261+
}
210262
exports.isArrayBuffer = isArrayBuffer;
211263

212-
function isDataView(value) {
264+
function isDataViewToString(value) {
213265
return ObjectToString(value) === '[object DataView]';
214266
}
267+
isDataViewToString.working = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined' && isDataViewToString(new DataView(new ArrayBuffer()));
268+
function isDataView(value) {
269+
if (typeof DataView === 'undefined') {
270+
return false;
271+
}
272+
273+
return isDataViewToString.working
274+
? isDataViewToString(value)
275+
: value instanceof DataView;
276+
}
215277
exports.isDataView = isDataView;
216278

217-
function isSharedArrayBuffer(value) {
279+
function isSharedArrayBufferToString(value) {
218280
return ObjectToString(value) === '[object SharedArrayBuffer]';
219281
}
282+
isSharedArrayBufferToString.working = typeof SharedArrayBuffer !== 'undefined' && isSharedArrayBufferToString(new SharedArrayBuffer());
283+
function isSharedArrayBuffer(value) {
284+
if (typeof SharedArrayBuffer === 'undefined') {
285+
return false;
286+
}
287+
288+
return isSharedArrayBufferToString.working
289+
? isSharedArrayBufferToString(value)
290+
: value instanceof SharedArrayBuffer;
291+
}
220292
exports.isSharedArrayBuffer = isSharedArrayBuffer;
221293

222294
function isAsyncFunction(value) {

0 commit comments

Comments
 (0)