1 var Map = require('./Map'),
2 Set = require('./Set');
4 /** `Object#toString` result references. */
5 var mapTag = '[object Map]',
6 objectTag = '[object Object]',
7 setTag = '[object Set]';
9 /** Used for built-in method references. */
10 var objectProto = global.Object.prototype;
12 /** Used to resolve the decompiled source of functions. */
13 var funcToString = global.Function.prototype.toString;
16 * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
19 var objectToString = objectProto.toString;
21 /** Used to detect maps and sets. */
22 var mapCtorString = Map ? funcToString.call(Map) : '',
23 setCtorString = Set ? funcToString.call(Set) : '';
26 * Gets the `toStringTag` of `value`.
29 * @param {*} value The value to query.
30 * @returns {string} Returns the `toStringTag`.
32 function getTag(value) {
33 return objectToString.call(value);
36 // Fallback for IE 11 providing `toStringTag` values for maps and sets.
37 if ((Map && getTag(new Map) != mapTag) || (Set && getTag(new Set) != setTag)) {
38 getTag = function(value) {
39 var result = objectToString.call(value),
40 Ctor = result == objectTag ? value.constructor : null,
41 ctorString = typeof Ctor == 'function' ? funcToString.call(Ctor) : '';
44 if (ctorString == mapCtorString) {
47 if (ctorString == setCtorString) {
55 module.exports = getTag;