_methodFingerprint.js

- Jump To … +
  modules/_baseCreate.js modules/_baseIteratee.js modules/_cb.js modules/_chainResult.js modules/_collectNonEnumProps.js modules/_createAssigner.js modules/_createEscaper.js modules/_createIndexFinder.js modules/_createPredicateIndexFinder.js modules/_createReduce.js modules/_createSizePropertyCheck.js modules/_deepGet.js modules/_escapeMap.js modules/_executeBound.js modules/_flatten.js modules/_getByteLength.js modules/_getLength.js modules/_group.js modules/_has.js modules/_hasObjectTag.js modules/_isArrayLike.js modules/_isBufferLike.js modules/_keyInObj.js modules/_methodFingerprint.js modules/_optimizeCb.js modules/_setup.js modules/_shallowProperty.js modules/_stringTagBug.js modules/_tagTester.js modules/_toBufferView.js modules/_toPath.js modules/_unescapeMap.js modules/after.js modules/allKeys.js modules/before.js modules/bind.js modules/bindAll.js modules/chain.js modules/chunk.js modules/clone.js modules/compact.js modules/compose.js modules/constant.js modules/contains.js modules/countBy.js modules/create.js modules/debounce.js modules/defaults.js modules/defer.js modules/delay.js modules/difference.js modules/each.js modules/escape.js modules/every.js modules/extend.js modules/extendOwn.js modules/filter.js modules/find.js modules/findIndex.js modules/findKey.js modules/findLastIndex.js modules/findWhere.js modules/first.js modules/flatten.js modules/functions.js modules/get.js modules/groupBy.js modules/has.js modules/identity.js modules/index-all.js modules/index-default.js modules/index.js modules/indexBy.js modules/indexOf.js modules/initial.js modules/intersection.js modules/invert.js modules/invoke.js modules/isArguments.js modules/isArray.js modules/isArrayBuffer.js modules/isBoolean.js modules/isDataView.js modules/isDate.js modules/isElement.js modules/isEmpty.js modules/isEqual.js modules/isError.js modules/isFinite.js modules/isFunction.js modules/isMap.js modules/isMatch.js modules/isNaN.js modules/isNull.js modules/isNumber.js modules/isObject.js modules/isRegExp.js modules/isSet.js modules/isString.js modules/isSymbol.js modules/isTypedArray.js modules/isUndefined.js modules/isWeakMap.js modules/isWeakSet.js modules/iteratee.js modules/keys.js modules/last.js modules/lastIndexOf.js modules/map.js modules/mapObject.js modules/matcher.js modules/max.js modules/memoize.js modules/min.js modules/mixin.js modules/negate.js modules/noop.js modules/now.js modules/object.js modules/omit.js modules/once.js modules/pairs.js modules/partial.js modules/partition.js modules/pick.js modules/pluck.js modules/property.js modules/propertyOf.js modules/random.js modules/range.js modules/reduce.js modules/reduceRight.js modules/reject.js modules/rest.js modules/restArguments.js modules/result.js modules/sample.js modules/shuffle.js modules/size.js modules/some.js modules/sortBy.js modules/sortedIndex.js modules/tap.js modules/template.js modules/templateSettings.js modules/throttle.js modules/times.js modules/toArray.js modules/toPath.js modules/underscore-array-methods.js modules/underscore.js modules/unescape.js modules/union.js modules/uniq.js modules/uniqueId.js modules/unzip.js modules/values.js modules/where.js modules/without.js modules/wrap.js modules/zip.js

- # _methodFingerprint.js

- ¶

      import getLength from './_getLength.js';
      import isFunction from './isFunction.js';
      import allKeys from './allKeys.js';

- ¶

  Since the regular `Object.prototype.toString` type tests don’t work for some types in IE 11, we use a fingerprinting heuristic instead, based on the methods. It’s not great, but it’s the best we got. The fingerprint method lists are defined below.

      export function ie11fingerprint(methods) {
        var length = getLength(methods);
        return function(obj) {
          if (obj == null) return false;

- ¶

  `Map`, `WeakMap` and `Set` have no enumerable keys.

          var keys = allKeys(obj);
          if (getLength(keys)) return false;
          for (var i = 0; i < length; i++) {
            if (!isFunction(obj[methods[i]])) return false;
          }

- ¶

  If we are testing against `WeakMap`, we need to ensure that `obj` doesn’t have a `forEach` method in order to distinguish it from a regular `Map`.

          return methods !== weakMapMethods || !isFunction(obj[forEachName]);
        };
      }

- ¶

  In the interest of compact minification, we write each string in the fingerprints only once.

      var forEachName = 'forEach',
          hasName = 'has',
          commonInit = ['clear', 'delete'],
          mapTail = ['get', hasName, 'set'];

- ¶

  `Map`, `WeakMap` and `Set` each have slightly different combinations of the above sublists.

      export var mapMethods = commonInit.concat(forEachName, mapTail),
          weakMapMethods = commonInit.concat(mapTail),
          setMethods = ['add'].concat(commonInit, forEachName, hasName);