Index: test/js-perf-test/Lodash/lodash.custom.js |
diff --git a/test/js-perf-test/Lodash/lodash.custom.js b/test/js-perf-test/Lodash/lodash.custom.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dd17001f01032d058194483133789c18bc3f8846 |
--- /dev/null |
+++ b/test/js-perf-test/Lodash/lodash.custom.js |
@@ -0,0 +1,795 @@ |
+/** |
+ * @license |
caitp (gmail)
2016/03/04 16:50:16
The infra isn't happy about the lodash file not co
Camillo Bruni
2016/03/04 17:18:37
For our purpose I guess it would suffice to just h
|
+ * lodash 4.5.1 (Custom Build) <https://lodash.com/> |
+ * Build: `lodash include="values,toPairs"` |
+ * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> |
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> |
+ * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors |
+ * Available under MIT license <https://lodash.com/license> |
+ */ |
+;(function() { |
+ |
+ /** Used as a safe reference for `undefined` in pre-ES5 environments. */ |
+ var undefined; |
+ |
+ /** Used as the semantic version number. */ |
+ var VERSION = '4.5.1'; |
+ |
+ /** Used as references for various `Number` constants. */ |
+ var MAX_SAFE_INTEGER = 9007199254740991; |
+ |
+ /** `Object#toString` result references. */ |
+ var argsTag = '[object Arguments]', |
+ funcTag = '[object Function]', |
+ genTag = '[object GeneratorFunction]', |
+ stringTag = '[object String]'; |
+ |
+ /** Used to detect unsigned integer values. */ |
+ var reIsUint = /^(?:0|[1-9]\d*)$/; |
+ |
+ /** Used to determine if values are of the language type `Object`. */ |
+ var objectTypes = { |
+ 'function': true, |
+ 'object': true |
+ }; |
+ |
+ /** Detect free variable `exports`. */ |
+ var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) |
+ ? exports |
+ : undefined; |
+ |
+ /** Detect free variable `module`. */ |
+ var freeModule = (objectTypes[typeof module] && module && !module.nodeType) |
+ ? module |
+ : undefined; |
+ |
+ /** Detect the popular CommonJS extension `module.exports`. */ |
+ var moduleExports = (freeModule && freeModule.exports === freeExports) |
+ ? freeExports |
+ : undefined; |
+ |
+ /** Detect free variable `global` from Node.js. */ |
+ var freeGlobal = checkGlobal(freeExports && freeModule && typeof global == 'object' && global); |
+ |
+ /** Detect free variable `self`. */ |
+ var freeSelf = checkGlobal(objectTypes[typeof self] && self); |
+ |
+ /** Detect free variable `window`. */ |
+ var freeWindow = checkGlobal(objectTypes[typeof window] && window); |
+ |
+ /** Detect `this` as the global object. */ |
+ var thisGlobal = checkGlobal(objectTypes[typeof this] && this); |
+ |
+ /** |
+ * Used as a reference to the global object. |
+ * |
+ * The `this` value is used if it's the global object to avoid Greasemonkey's |
+ * restricted `window` object, otherwise the `window` object is used. |
+ */ |
+ var root = freeGlobal || |
+ ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || |
+ freeSelf || thisGlobal || Function('return this')(); |
+ |
+ /*--------------------------------------------------------------------------*/ |
+ |
+ /** |
+ * A specialized version of `_.map` for arrays without support for iteratee |
+ * shorthands. |
+ * |
+ * @private |
+ * @param {Array} array The array to iterate over. |
+ * @param {Function} iteratee The function invoked per iteration. |
+ * @returns {Array} Returns the new mapped array. |
+ */ |
+ function arrayMap(array, iteratee) { |
+ var index = -1, |
+ length = array.length, |
+ result = Array(length); |
+ |
+ while (++index < length) { |
+ result[index] = iteratee(array[index], index, array); |
+ } |
+ return result; |
+ } |
+ |
+ /** |
+ * The base implementation of `_.times` without support for iteratee shorthands |
+ * or max array length checks. |
+ * |
+ * @private |
+ * @param {number} n The number of times to invoke `iteratee`. |
+ * @param {Function} iteratee The function invoked per iteration. |
+ * @returns {Array} Returns the array of results. |
+ */ |
+ function baseTimes(n, iteratee) { |
+ var index = -1, |
+ result = Array(n); |
+ |
+ while (++index < n) { |
+ result[index] = iteratee(index); |
+ } |
+ return result; |
+ } |
+ |
+ /** |
+ * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array |
+ * of key-value pairs for `object` corresponding to the property names of `props`. |
+ * |
+ * @private |
+ * @param {Object} object The object to query. |
+ * @param {Array} props The property names to get values for. |
+ * @returns {Object} Returns the new array of key-value pairs. |
+ */ |
+ function baseToPairs(object, props) { |
+ return arrayMap(props, function(key) { |
+ return [key, object[key]]; |
+ }); |
+ } |
+ |
+ /** |
+ * The base implementation of `_.values` and `_.valuesIn` which creates an |
+ * array of `object` property values corresponding to the property names |
+ * of `props`. |
+ * |
+ * @private |
+ * @param {Object} object The object to query. |
+ * @param {Array} props The property names to get values for. |
+ * @returns {Object} Returns the array of property values. |
+ */ |
+ function baseValues(object, props) { |
+ return arrayMap(props, function(key) { |
+ return object[key]; |
+ }); |
+ } |
+ |
+ /** |
+ * Checks if `value` is a global object. |
+ * |
+ * @private |
+ * @param {*} value The value to check. |
+ * @returns {null|Object} Returns `value` if it's a global object, else `null`. |
+ */ |
+ function checkGlobal(value) { |
+ return (value && value.Object === Object) ? value : null; |
+ } |
+ |
+ /** |
+ * Checks if `value` is a valid array-like index. |
+ * |
+ * @private |
+ * @param {*} value The value to check. |
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. |
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. |
+ */ |
+ function isIndex(value, length) { |
+ value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; |
+ length = length == null ? MAX_SAFE_INTEGER : length; |
+ return value > -1 && value % 1 == 0 && value < length; |
+ } |
+ |
+ /*--------------------------------------------------------------------------*/ |
+ |
+ /** Used for built-in method references. */ |
+ var objectProto = Object.prototype; |
+ |
+ /** Used to check objects for own properties. */ |
+ var hasOwnProperty = objectProto.hasOwnProperty; |
+ |
+ /** |
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) |
+ * of values. |
+ */ |
+ var objectToString = objectProto.toString; |
+ |
+ /** Built-in value references. */ |
+ var Symbol = root.Symbol, |
+ getPrototypeOf = Object.getPrototypeOf, |
+ propertyIsEnumerable = objectProto.propertyIsEnumerable; |
+ |
+ /* Built-in method references for those with the same name as other `lodash` methods. */ |
+ var nativeKeys = Object.keys; |
+ |
+ /** Used to lookup unminified function names. */ |
+ var realNames = {}; |
+ |
+ /*------------------------------------------------------------------------*/ |
+ |
+ /** |
+ * Creates a `lodash` object which wraps `value` to enable implicit method |
+ * chaining. Methods that operate on and return arrays, collections, and |
+ * functions can be chained together. Methods that retrieve a single value or |
+ * may return a primitive value will automatically end the chain sequence and |
+ * return the unwrapped value. Otherwise, the value must be unwrapped with |
+ * `_#value`. |
+ * |
+ * Explicit chaining, which must be unwrapped with `_#value` in all cases, |
+ * may be enabled using `_.chain`. |
+ * |
+ * The execution of chained methods is lazy, that is, it's deferred until |
+ * `_#value` is implicitly or explicitly called. |
+ * |
+ * Lazy evaluation allows several methods to support shortcut fusion. Shortcut |
+ * fusion is an optimization to merge iteratee calls; this avoids the creation |
+ * of intermediate arrays and can greatly reduce the number of iteratee executions. |
+ * Sections of a chain sequence qualify for shortcut fusion if the section is |
+ * applied to an array of at least two hundred elements and any iteratees |
+ * accept only one argument. The heuristic for whether a section qualifies |
+ * for shortcut fusion is subject to change. |
+ * |
+ * Chaining is supported in custom builds as long as the `_#value` method is |
+ * directly or indirectly included in the build. |
+ * |
+ * In addition to lodash methods, wrappers have `Array` and `String` methods. |
+ * |
+ * The wrapper `Array` methods are: |
+ * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` |
+ * |
+ * The wrapper `String` methods are: |
+ * `replace` and `split` |
+ * |
+ * The wrapper methods that support shortcut fusion are: |
+ * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, |
+ * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, |
+ * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` |
+ * |
+ * The chainable wrapper methods are: |
+ * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, |
+ * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, |
+ * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, |
+ * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, `difference`, |
+ * `differenceBy`, `differenceWith`, `drop`, `dropRight`, `dropRightWhile`, |
+ * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flattenDepth`, |
+ * `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, `functionsIn`, |
+ * `groupBy`, `initial`, `intersection`, `intersectionBy`, `intersectionWith`, |
+ * `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, `keys`, `keysIn`, |
+ * `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, `memoize`, |
+ * `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, `nthArg`, |
+ * `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, `overEvery`, |
+ * `overSome`, `partial`, `partialRight`, `partition`, `pick`, `pickBy`, `plant`, |
+ * `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, `pullAt`, `push`, |
+ * `range`, `rangeRight`, `rearg`, `reject`, `remove`, `rest`, `reverse`, |
+ * `sampleSize`, `set`, `setWith`, `shuffle`, `slice`, `sort`, `sortBy`, |
+ * `splice`, `spread`, `tail`, `take`, `takeRight`, `takeRightWhile`, |
+ * `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, `toPairs`, `toPairsIn`, |
+ * `toPath`, `toPlainObject`, `transform`, `unary`, `union`, `unionBy`, |
+ * `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, `unshift`, `unzip`, |
+ * `unzipWith`, `values`, `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, |
+ * `xorWith`, `zip`, `zipObject`, `zipObjectDeep`, and `zipWith` |
+ * |
+ * The wrapper methods that are **not** chainable by default are: |
+ * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, |
+ * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `deburr`, `endsWith`, `eq`, |
+ * `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, |
+ * `findLastIndex`, `findLastKey`, `floor`, `forEach`, `forEachRight`, `forIn`, |
+ * `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, `hasIn`, |
+ * `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, `isArguments`, |
+ * `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, `isBoolean`, |
+ * `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`, |
+ * `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMap`, |
+ * `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, `isNumber`, |
+ * `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, `isSafeInteger`, |
+ * `isSet`, `isString`, `isUndefined`, `isTypedArray`, `isWeakMap`, `isWeakSet`, |
+ * `join`, `kebabCase`, `last`, `lastIndexOf`, `lowerCase`, `lowerFirst`, |
+ * `lt`, `lte`, `max`, `maxBy`, `mean`, `min`, `minBy`, `noConflict`, `noop`, |
+ * `now`, `pad`, `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, |
+ * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `sample`, |
+ * `shift`, `size`, `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, |
+ * `sortedLastIndex`, `sortedLastIndexBy`, `startCase`, `startsWith`, `subtract`, |
+ * `sum`, `sumBy`, `template`, `times`, `toLower`, `toInteger`, `toLength`, |
+ * `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, `trimEnd`, |
+ * `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, `upperFirst`, |
+ * `value`, and `words` |
+ * |
+ * @name _ |
+ * @constructor |
+ * @category Seq |
+ * @param {*} value The value to wrap in a `lodash` instance. |
+ * @returns {Object} Returns the new `lodash` wrapper instance. |
+ * @example |
+ * |
+ * function square(n) { |
+ * return n * n; |
+ * } |
+ * |
+ * var wrapped = _([1, 2, 3]); |
+ * |
+ * // Returns an unwrapped value. |
+ * wrapped.reduce(_.add); |
+ * // => 6 |
+ * |
+ * // Returns a wrapped value. |
+ * var squares = wrapped.map(square); |
+ * |
+ * _.isArray(squares); |
+ * // => false |
+ * |
+ * _.isArray(squares.value()); |
+ * // => true |
+ */ |
+ function lodash() { |
+ // No operation performed. |
+ } |
+ |
+ /*------------------------------------------------------------------------*/ |
+ |
+ /** |
+ * The base implementation of `_.has` without support for deep paths. |
+ * |
+ * @private |
+ * @param {Object} object The object to query. |
+ * @param {Array|string} key The key to check. |
+ * @returns {boolean} Returns `true` if `key` exists, else `false`. |
+ */ |
+ function baseHas(object, key) { |
+ // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`, |
+ // that are composed entirely of index properties, return `false` for |
+ // `hasOwnProperty` checks of them. |
+ return hasOwnProperty.call(object, key) || |
+ (typeof object == 'object' && key in object && getPrototypeOf(object) === null); |
+ } |
+ |
+ /** |
+ * The base implementation of `_.keys` which doesn't skip the constructor |
+ * property of prototypes or treat sparse arrays as dense. |
+ * |
+ * @private |
+ * @param {Object} object The object to query. |
+ * @returns {Array} Returns the array of property names. |
+ */ |
+ function baseKeys(object) { |
+ return nativeKeys(Object(object)); |
+ } |
+ |
+ /** |
+ * The base implementation of `_.property` without support for deep paths. |
+ * |
+ * @private |
+ * @param {string} key The key of the property to get. |
+ * @returns {Function} Returns the new function. |
+ */ |
+ function baseProperty(key) { |
+ return function(object) { |
+ return object == null ? undefined : object[key]; |
+ }; |
+ } |
+ |
+ /** |
+ * Gets the "length" property value of `object`. |
+ * |
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) |
+ * that affects Safari on at least iOS 8.1-8.3 ARM64. |
+ * |
+ * @private |
+ * @param {Object} object The object to query. |
+ * @returns {*} Returns the "length" value. |
+ */ |
+ var getLength = baseProperty('length'); |
+ |
+ /** |
+ * Creates an array of index keys for `object` values of arrays, |
+ * `arguments` objects, and strings, otherwise `null` is returned. |
+ * |
+ * @private |
+ * @param {Object} object The object to query. |
+ * @returns {Array|null} Returns index keys, else `null`. |
+ */ |
+ function indexKeys(object) { |
+ var length = object ? object.length : undefined; |
+ if (isLength(length) && |
+ (isArray(object) || isString(object) || isArguments(object))) { |
+ return baseTimes(length, String); |
+ } |
+ return null; |
+ } |
+ |
+ /** |
+ * Checks if `value` is likely a prototype object. |
+ * |
+ * @private |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. |
+ */ |
+ function isPrototype(value) { |
+ var Ctor = value && value.constructor, |
+ proto = (isFunction(Ctor) && Ctor.prototype) || objectProto; |
+ |
+ return value === proto; |
+ } |
+ |
+ /*------------------------------------------------------------------------*/ |
+ |
+ /** |
+ * Checks if `value` is likely an `arguments` object. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Lang |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
+ * @example |
+ * |
+ * _.isArguments(function() { return arguments; }()); |
+ * // => true |
+ * |
+ * _.isArguments([1, 2, 3]); |
+ * // => false |
+ */ |
+ function isArguments(value) { |
+ // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode. |
+ return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && |
+ (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); |
+ } |
+ |
+ /** |
+ * Checks if `value` is classified as an `Array` object. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @type {Function} |
+ * @category Lang |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
+ * @example |
+ * |
+ * _.isArray([1, 2, 3]); |
+ * // => true |
+ * |
+ * _.isArray(document.body.children); |
+ * // => false |
+ * |
+ * _.isArray('abc'); |
+ * // => false |
+ * |
+ * _.isArray(_.noop); |
+ * // => false |
+ */ |
+ var isArray = Array.isArray; |
+ |
+ /** |
+ * Checks if `value` is array-like. A value is considered array-like if it's |
+ * not a function and has a `value.length` that's an integer greater than or |
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Lang |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`. |
+ * @example |
+ * |
+ * _.isArrayLike([1, 2, 3]); |
+ * // => true |
+ * |
+ * _.isArrayLike(document.body.children); |
+ * // => true |
+ * |
+ * _.isArrayLike('abc'); |
+ * // => true |
+ * |
+ * _.isArrayLike(_.noop); |
+ * // => false |
+ */ |
+ function isArrayLike(value) { |
+ return value != null && |
+ !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value)); |
+ } |
+ |
+ /** |
+ * This method is like `_.isArrayLike` except that it also checks if `value` |
+ * is an object. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Lang |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`. |
+ * @example |
+ * |
+ * _.isArrayLikeObject([1, 2, 3]); |
+ * // => true |
+ * |
+ * _.isArrayLikeObject(document.body.children); |
+ * // => true |
+ * |
+ * _.isArrayLikeObject('abc'); |
+ * // => false |
+ * |
+ * _.isArrayLikeObject(_.noop); |
+ * // => false |
+ */ |
+ function isArrayLikeObject(value) { |
+ return isObjectLike(value) && isArrayLike(value); |
+ } |
+ |
+ /** |
+ * Checks if `value` is classified as a `Function` object. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Lang |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
+ * @example |
+ * |
+ * _.isFunction(_); |
+ * // => true |
+ * |
+ * _.isFunction(/abc/); |
+ * // => false |
+ */ |
+ function isFunction(value) { |
+ // The use of `Object#toString` avoids issues with the `typeof` operator |
+ // in Safari 8 which returns 'object' for typed array constructors, and |
+ // PhantomJS 1.9 which returns 'function' for `NodeList` instances. |
+ var tag = isObject(value) ? objectToString.call(value) : ''; |
+ return tag == funcTag || tag == genTag; |
+ } |
+ |
+ /** |
+ * Checks if `value` is a valid array-like length. |
+ * |
+ * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Lang |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. |
+ * @example |
+ * |
+ * _.isLength(3); |
+ * // => true |
+ * |
+ * _.isLength(Number.MIN_VALUE); |
+ * // => false |
+ * |
+ * _.isLength(Infinity); |
+ * // => false |
+ * |
+ * _.isLength('3'); |
+ * // => false |
+ */ |
+ function isLength(value) { |
+ return typeof value == 'number' && |
+ value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; |
+ } |
+ |
+ /** |
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. |
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Lang |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`. |
+ * @example |
+ * |
+ * _.isObject({}); |
+ * // => true |
+ * |
+ * _.isObject([1, 2, 3]); |
+ * // => true |
+ * |
+ * _.isObject(_.noop); |
+ * // => true |
+ * |
+ * _.isObject(null); |
+ * // => false |
+ */ |
+ function isObject(value) { |
+ var type = typeof value; |
+ return !!value && (type == 'object' || type == 'function'); |
+ } |
+ |
+ /** |
+ * Checks if `value` is object-like. A value is object-like if it's not `null` |
+ * and has a `typeof` result of "object". |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Lang |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`. |
+ * @example |
+ * |
+ * _.isObjectLike({}); |
+ * // => true |
+ * |
+ * _.isObjectLike([1, 2, 3]); |
+ * // => true |
+ * |
+ * _.isObjectLike(_.noop); |
+ * // => false |
+ * |
+ * _.isObjectLike(null); |
+ * // => false |
+ */ |
+ function isObjectLike(value) { |
+ return !!value && typeof value == 'object'; |
+ } |
+ |
+ /** |
+ * Checks if `value` is classified as a `String` primitive or object. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Lang |
+ * @param {*} value The value to check. |
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
+ * @example |
+ * |
+ * _.isString('abc'); |
+ * // => true |
+ * |
+ * _.isString(1); |
+ * // => false |
+ */ |
+ function isString(value) { |
+ return typeof value == 'string' || |
+ (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag); |
+ } |
+ |
+ /*------------------------------------------------------------------------*/ |
+ |
+ /** |
+ * Creates an array of the own enumerable property names of `object`. |
+ * |
+ * **Note:** Non-object values are coerced to objects. See the |
+ * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) |
+ * for more details. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Object |
+ * @param {Object} object The object to query. |
+ * @returns {Array} Returns the array of property names. |
+ * @example |
+ * |
+ * function Foo() { |
+ * this.a = 1; |
+ * this.b = 2; |
+ * } |
+ * |
+ * Foo.prototype.c = 3; |
+ * |
+ * _.keys(new Foo); |
+ * // => ['a', 'b'] (iteration order is not guaranteed) |
+ * |
+ * _.keys('hi'); |
+ * // => ['0', '1'] |
+ */ |
+ function keys(object) { |
+ var isProto = isPrototype(object); |
+ if (!(isProto || isArrayLike(object))) { |
+ return baseKeys(object); |
+ } |
+ var indexes = indexKeys(object), |
+ skipIndexes = !!indexes, |
+ result = indexes || [], |
+ length = result.length; |
+ |
+ for (var key in object) { |
+ if (baseHas(object, key) && |
+ !(skipIndexes && (key == 'length' || isIndex(key, length))) && |
+ !(isProto && key == 'constructor')) { |
+ result.push(key); |
+ } |
+ } |
+ return result; |
+ } |
+ |
+ /** |
+ * Creates an array of own enumerable key-value pairs for `object` which |
+ * can be consumed by `_.fromPairs`. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Object |
+ * @param {Object} object The object to query. |
+ * @returns {Array} Returns the new array of key-value pairs. |
+ * @example |
+ * |
+ * function Foo() { |
+ * this.a = 1; |
+ * this.b = 2; |
+ * } |
+ * |
+ * Foo.prototype.c = 3; |
+ * |
+ * _.toPairs(new Foo); |
+ * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) |
+ */ |
+ function toPairs(object) { |
+ return baseToPairs(object, keys(object)); |
+ } |
+ |
+ /** |
+ * Creates an array of the own enumerable property values of `object`. |
+ * |
+ * **Note:** Non-object values are coerced to objects. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @category Object |
+ * @param {Object} object The object to query. |
+ * @returns {Array} Returns the array of property values. |
+ * @example |
+ * |
+ * function Foo() { |
+ * this.a = 1; |
+ * this.b = 2; |
+ * } |
+ * |
+ * Foo.prototype.c = 3; |
+ * |
+ * _.values(new Foo); |
+ * // => [1, 2] (iteration order is not guaranteed) |
+ * |
+ * _.values('hi'); |
+ * // => ['h', 'i'] |
+ */ |
+ function values(object) { |
+ return object ? baseValues(object, keys(object)) : []; |
+ } |
+ |
+ /*------------------------------------------------------------------------*/ |
+ |
+ // Add functions that return wrapped values when chaining. |
+ lodash.keys = keys; |
+ lodash.toPairs = toPairs; |
+ lodash.values = values; |
+ |
+ /*------------------------------------------------------------------------*/ |
+ |
+ // Add functions that return unwrapped values when chaining. |
+ lodash.isArguments = isArguments; |
+ lodash.isArray = isArray; |
+ lodash.isArrayLike = isArrayLike; |
+ lodash.isArrayLikeObject = isArrayLikeObject; |
+ lodash.isFunction = isFunction; |
+ lodash.isLength = isLength; |
+ lodash.isObject = isObject; |
+ lodash.isObjectLike = isObjectLike; |
+ lodash.isString = isString; |
+ |
+ /*------------------------------------------------------------------------*/ |
+ |
+ /** |
+ * The semantic version number. |
+ * |
+ * @static |
+ * @memberOf _ |
+ * @type {string} |
+ */ |
+ lodash.VERSION = VERSION; |
+ |
+ /*--------------------------------------------------------------------------*/ |
+ |
+ // Expose lodash on the free variable `window` or `self` when available. This |
+ // prevents errors in cases where lodash is loaded by a script tag in the presence |
+ // of an AMD loader. See http://requirejs.org/docs/errors.html#mismatch for more details. |
+ (freeWindow || freeSelf || {})._ = lodash; |
+ |
+ // Some AMD build optimizers like r.js check for condition patterns like the following: |
+ if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { |
+ // Define as an anonymous module so, through path mapping, it can be |
+ // referenced as the "underscore" module. |
+ define(function() { |
+ return lodash; |
+ }); |
+ } |
+ // Check for `exports` after `define` in case a build optimizer adds an `exports` object. |
+ else if (freeExports && freeModule) { |
+ // Export for Node.js. |
+ if (moduleExports) { |
+ (freeModule.exports = lodash)._ = lodash; |
+ } |
+ // Export for CommonJS support. |
+ freeExports._ = lodash; |
+ } |
+ else { |
+ // Export to the global object. |
+ root._ = lodash; |
+ } |
+}.call(this)); |