A drop-in replacement* for Underscore.js, from the devs behind jsPerf.com, delivering performance, bug fixes, and additional features.
Lo-Dash’s performance is gained by avoiding slower native methods, instead opting for simplified non-ES5 compliant methods optimized for common usage, and by leveraging function compilation to reduce the number of overall function calls.
- Development source
- Production source
- CDN copies of ≤ v0.7.0 are available on cdnjs thanks to CloudFlare
- For optimal performance, create a custom build with only the features you need
We’ve got API docs, benchmarks, and unit tests.
Create your own benchmarks at jsPerf, or search for existing ones.
For a list of upcoming features, check out our roadmap.
For more information check out these screencasts over Lo-Dash:
- Introducing Lo-Dash
- Lo-Dash optimizations and custom builds
- Lo-Dash’s origin and why it’s a better utility belt
- Unit testing in Lo-Dash
- Lo-Dash’s approach to native method use
- AMD loader support (RequireJS, curl.js, etc.)
- _.bind supports “lazy” binding
- _.clone supports “deep” cloning
- _.countBy as a companion function for _.groupBy and _.sortBy
- _.debounce’ed functions match _.throttle’ed functions’ return value behavior
- _.forEach is chainable and supports exiting iteration early
- _.forIn for iterating over an object’s own and inherited properties
- _.forOwn for iterating over an object’s own properties
- _.indexOf and _.lastIndexOf accept a
fromIndexargument - _.invert to create inverted objects
- _.merge for a “deep” _.extend
- _.object and _.pairs for composing objects
- _.omit for the inverse functionality of _.pick
- _.partial for partial application without
thisbinding - _.pick and _.omit accept
callbackandthisArgarguments - _.random for generating random numbers within a given range
- _.sortBy performs a stable sort
- _.template utilizes sourceURLs for easier debugging
- _.unescape to unescape strings escaped by _.escape
- _.where for filtering collections by contained properties
- _.countBy, _.groupBy, _.sortedIndex, and _.uniq accept a
thisArgargument - _.contains, _.size, _.toArray, and more… accept strings
Lo-Dash has been tested in at least Chrome 5-21, Firefox 1-15, IE 6-9, Opera 9.25-12, Safari 3-6, Node.js 0.4.8-0.8.8, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC5.
Custom builds make it easy to create lightweight versions of Lo-Dash containing only the methods you need. To top it off, we handle all method dependency and alias mapping for you.
- Backbone builds, with only methods required by Backbone, may be created using the
backbonemodifier argument.
lodash backbone- CSP builds, supporting default Content Security Policy restrictions, may be created using the
cspmodifier argument.
lodash csp- Legacy builds, tailored for older browsers without ES5 support, may be created using the
legacymodifier argument.
lodash legacy- Mobile builds, with IE < 9 bug fixes and method compilation removed, may be created using the
mobilemodifier argument.
lodash mobile- Strict builds, with
_.bindAll,_.defaults, and_.extendin strict mode, may be created using thestrictmodifier argument.
lodash strict- Underscore builds, with iteration fixes removed and only Underscore’s API, may be created using the
underscoremodifier argument.
lodash underscoreCustom builds may be created using the following commands:
- Use the
categoryargument to pass comma separated categories of methods to include in the build.
Valid categories are “arrays”, “chaining”, “collections”, “functions”, “objects”, and “utilities”.
lodash category=collections,functions
lodash category="collections, functions"- Use the
excludeargument to pass comma separated names of methods to exclude from the build.
lodash exclude=union,uniq,zip
lodash exclude="union, uniq, zip"- Use the
exportsargument to pass comma separated names of ways to export theLoDashfunction.
Valid exports are “amd”, “commonjs”, “global”, “node”, and “none”.
lodash exports=amd,commonjs,node
lodash include="amd, commonjs, node"- Use the
iifeargument to specify code to replace the immediately-invoked function expression that wraps Lo-Dash.
lodash iife="!function(window,undefined){%output%}(this)"- Use the
includeargument to pass comma separated names of methods to include in the build.
lodash include=each,filter,map
lodash include="each, filter, map"All arguments, except exclude with include and legacy with csp/mobile, may be combined.
lodash backbone legacy exports=global category=utilities exclude=first,last
lodash -s underscore mobile strict exports=amd category=functions include=pick,uniqThe following options are also supported:
-c,--stdoutWrite output to standard output-h,--helpDisplay help information-o,--outputWrite output to a given path/filename-s,--silentSkip status updates normally logged to the console-V,--versionOutput current version of Lo-Dash
The lodash command-line utility is available when Lo-Dash is installed as a global package (i.e. npm install -g lodash).
Custom builds are saved to lodash.custom.js and lodash.custom.min.js.
In browsers:
<script src="lodash.js"></script>Using npm:
npm install lodash
npm install -g lodashIn Node.js and RingoJS v0.8.0+:
var _ = require('lodash');In RingoJS v0.7.0-:
var _ = require('lodash')._;In Rhino:
load('lodash.js');In an AMD loader like RequireJS:
require({
'paths': {
'underscore': 'path/to/lodash'
}
},
['underscore'], function(_) {
console.log(_.VERSION);
});- Allow iteration of objects with a
lengthproperty [#148, #154, #252, #448, #659, test] - Ensure array-like objects with invalid
lengthproperties are treated like regular objects [#741, test] - Ensure “Arrays”, “Collections”, and “Objects” methods don’t error when passed falsey arguments [#650, test]
- Ensure “Collections” methods allow string
collectionarguments [#247, #276, #561, test] - Fix cross-browser object iteration bugs [#60, #376, test]
- Methods should work on pages with incorrectly shimmed native methods [#7, #742, test]
- Register as an AMD module, but still export to global [#431, test]
_.cloneshould allowdeepcloning [#595, test]_.containsshould work with strings [#667, test]_.countByand_.groupByshould only add values to own, not inherited, properties [#736, test]_.extendshould recursively extend objects [#379, #718, test]_.forEachshould be chainable [#142, test]_.forEachshould allow exiting iteration early [#211, test]_.isElementshould use strict equality for its duck type check [#734, test]_.isEmptyshould support jQuery/MooTools DOM query collections [#690, test]_.isEqualshould returntruefor like-objects from different documents [#733, test]_.isEqualshould use customisEqualmethods before checking strict equality [#748, test]_.isObjectshould avoid V8 bug #2291 [#605, test]_.isNaN(new Number(NaN))should returntrue[#749, test]_.keysshould work withargumentsobjects cross-browser [#396, test]_.rangeshould coerce arguments to numbers [#634, #683, test]_.reduceRightshould pass correct callback arguments when iterating objects [test]_.sortedIndexshould support arrays with highlengthvalues [#735, test]_.throttleshould work when called in a loop [#502, test]_.toArrayuses customtoArraymethods of arrays and strings [#747, test]
_.bind_.bindAll_.clone_.compact_.contains,_.include_.defaults_.defer_.difference_.each_.every,_.all_.extend_.filter,_.select_.find,_.detect_.flatten_.forEach,_.each_.functions,_.methods_.groupBy_.indexOf_.intersection_.invert_.invoke_.isArguments_.isDate_.isEmpty_.isFinite_.isFunction_.isObject_.isNumber_.isRegExp_.isString_.keys_.lastIndexOf_.map,_.collect_.max_.memoize_.min_.mixin_.omit_.pairs_.pick_.pluck_.reduce,_.foldl,_.inject_.reject_.result_.shuffle_.some,_.any_.sortBy_.sortedIndex_.template_.throttle_.times_.toArray_.union_.uniq,_.unique_.values_.without_.wrap_.zip- plus all
_(…)method wrappers
- Renamed
_.zipObjectto_.object - Replaced
_.dropwith_.omit - Made
_.dropalias_.rest
- Added _.invert, _.pairs, and _.random
- Added
_.resultto thebackbonebuild - Added
exports,iife,-c/--stdout,-o/--output, and-s/--silentbuild options - Ensured
isPlainObjectworks with objects from other documements - Ensured
_.isEqualcompares values with circular references correctly - Ensured
_.mergework with four or more arguments - Ensured
_.sortByperforms a stable sort forundefinedvalues - Ensured
_.templateworks with "interpolate" delimiters containing ternary operators - Ensured the production build works in Node.js
- Ensured template delimiters are tokenized correctly
- Made pseudo private properties
_chainand_wrappeddouble-underscored to avoid conflicts - Made
minify.jssupportunderscore.js - Reduced the size of
mobileandunderscorebuilds - Simplified
_.isEqualand_.size
The full changelog is available here.
Lo-Dash is part of the BestieJS “Best in Class” module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.