underscore
JavaScript's functional programming helper library.
About
JavaScript's functional programming helper library.
What detecting underscore tells you about a site
Underscore in a live bundle is a fingerprint of age. It predates lodash and was the utility library of the Backbone era, so finding it usually means you are looking at a long-lived codebase that started in the early-to-mid 2010s and never migrated its helpers. Where lodash-es signals deliberate modern tooling, underscore signals continuity: nobody removed it because too much code depends on its _.each, _.template and _.extend. It often travels in legacy admin panels, CMS back-ends and dashboards that have been maintained but not rewritten.
Why the exact underscore version matters
Underscore moved slowly, so versions look similar, but the late 1.x line quietly added modular imports and changed some internal behaviours around iteratee handling. More usefully, the pinned version is an archaeology marker: a very old underscore alongside jQuery and Backbone dates the bundle's origins more precisely than almost any other dependency.
underscore in a real-world stack
When you find underscore in a bundle, it rarely travels alone. Backbone.js and jQuery, the classic pre-React trio.
Quick facts
npm install underscoreHow Sourcemap Explorer detects underscore
underscore ships as v1.13.8, published 2026-02-19 and carries 0 direct dependencies, 55 versions on the registry. Those exact numbers are the footprint Sourcemap Explorer matches when underscore rides inside a deployed bundle — here is how the detection works.
We catch underscore from two complementary signals: bundled source paths and the embedded package.json. Modern bundlers (webpack, Vite, esbuild, Rollup, Turbopack) preserve the original node_modules/underscore/ paths inside the JavaScript sourcemap's sources[] array — that's the canonical signal. When the matching package.json is also captured in sourcesContent[], we read the exact version field — patch number included. No regex guessing, no version inference.
- 1
Confirm the site exposes sourcemaps
In DevTools Network, check the response headers of any application script for `SourceMap` or `X-SourceMap`. Failing that, fetch the script's last 4 KB and look for a `//# sourceMappingURL=` comment — that map is where the `underscore` paths live.
- 2
Find the package in the bundle
Open DevTools → Network → reload. Click any application script and look at its sourcemap. Inside, search `sources[]` for entries matching `node_modules/underscore/` — every match confirms the package is bundled. The matching `sourcesContent[i]` for `node_modules/underscore/package.json` gives you the exact installed version.
- 3
Read the version directly from package.json
Run `jq -r '. as $m | $m.sources | to_entries[] | select(.value | endswith("node_modules/underscore/package.json")) | $m.sourcesContent[.key] | fromjson | .version' bundle.js.map`. Sourcemap Explorer automates the same query in the popup.
Recent security advisories for underscore
The 2 most recent advisories affecting some versions of underscore, aggregated from OSV.dev (GitHub Advisory + CVE data). A listing here doesn't mean the version a given site ships is affected — each advisory applies to a specific version range. Sourcemap Explorer reads the exact bundled version so you can check it against these ranges.
Underscore has unlimited recursion in _.flatten and _.isEqual, potential for DoS attack
Arbitrary Code Execution in underscore
Recent versions
underscore README
Live mirror of the GitHub README, for reference. Updated whenever the repo's default branch changes.
__
/\ \ __
__ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____
/\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\
\ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\
\ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/
\/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/
\ \____/
\/___/
Underscore.js is a utility-belt library for JavaScript that provides support for the usual functional suspects (each, map, reduce, filter...) without extending any core JavaScript objects.
For Docs, License, Tests, and pre-packed downloads, see: https://underscorejs.org
For support and questions, please consult our security policy, the gitter channel or stackoverflow
Underscore is an open-sourced component of DocumentCloud: https://github.com/documentcloud
Many thanks to our contributors: https://github.com/jashkenas/underscore/contributors
You can support the project by donating on Patreon. Enterprise coverage is available as part of the Tidelift Subscription.
This project adheres to a code of conduct. By participating, you are expected to uphold this code.
FAQ
What is underscore used for?
JavaScript's functional programming helper library.
How can I tell if a website is using underscore?
Open the page in Chrome with the Sourcemap Explorer extension installed and read the Stack tab. We catch `underscore` from two complementary signals: `node_modules/underscore/` paths inside the JavaScript sourcemap, and the embedded `package.json` we read for exact-version detection. Without the extension you can do the same lookup manually in DevTools — the steps are listed in the "How Sourcemap Explorer detects" section above.
How do I find out which version of underscore a website is running?
Read it straight from the site's JavaScript sourcemap. When a build ships source maps, the bundled `underscore/package.json` carries the exact `version` string — Sourcemap Explorer extracts it in one click on the Stack tab, and you can do it by hand in DevTools by opening the `.map` file and searching for `node_modules/underscore/package.json`. That is far more reliable than inferring the version from an asset-hash or a `?ver=` query string, which is all surface-level detectors have to go on. The current npm release is 1.13.8, but real deployments frequently run an older pinned version — which is exactly why reading the bundled number matters.
What is the latest version of underscore?
1.13.8, as published on the npm registry. The "Recent versions" table on this page lists the most recent 8 releases with their release dates. Sourcemap Explorer reports the version actually bundled into a site, which can lag the latest release by months on real-world deployments.
Is underscore actively maintained?
Actively maintained — the package is shipping new releases at a steady cadence. The last published release was 2026-02-19. Source code: https://github.com/jashkenas/underscore.
Does underscore have known security vulnerabilities?
2 recent advisories affecting some versions of underscore are listed in the "Recent security advisories" section above, aggregated from OSV.dev (GitHub Advisory + CVE data). Whether a particular site is exposed depends entirely on the exact version it ships — each advisory applies to a specific version range, not to the package as a whole. That is why the precise bundled version matters: Sourcemap Explorer reads the version a site actually runs, so you can check it against the affected ranges instead of assuming the latest release is what's deployed.
Where can I read more?
Project homepage: https://underscorejs.org. Source code: https://github.com/jashkenas/underscore. Published on npm: https://www.npmjs.com/package/underscore. Licensed as MIT.
Detected by Sourcemap Explorer
When a bundle ships sourcemaps, we read the embedded package.json for underscore and report the precise version (the registry's latest is v1.13.8, published 2026-02-19; the bundled copy is often older). Without sourcemaps, an import / require in the page's scripts is enough to flag it.