A JavaScript engine implements ECMAScript: it parses source, runs it through interpreters and just-in-time (JIT) compilers, and collects garbage. On its own it cannot print text, read a file or change a page. A runtime (or host) embeds the engine and adds APIs and an event loop: a browser adds the DOM, fetch() and timers; Node.js 2,131 adds process, fs and network sockets. Browsers and Engines pairs these engines with browsers; Node.js Quick Start installs Node.js.
| Name | Kind | Maker / built on | Ships in / latest (Sept 2026) |
|---|---|---|---|
| V8 86,723 | Engine | Chrome 154 1 (V8 15.4), Edge, Node.js, Deno 60,577 | |
| SpiderMonkey 946,470 | Engine | Mozilla | Firefox 156 555 |
| JavaScriptCore | Engine | Apple | Safari 10 , all WebKit 15,343 browsers, Bun 73,307 |
| Node.js | Runtime | V8, libuv | 24.21 LTS (V8 13.6), 26.8 Current (V8 14.6) |
| Deno | Runtime | V8, Rust, Tokio | 2.9.6 (V8 15.0) |
| Bun | Runtime | JavaScriptCore, Rust | 1.4.2 |
The engine version decides which language features you get: Node.js 24 LTS runs a V8 from 2025, so a new ES2026 method may work in Chrome but not on your server. Node.js (2009) is the compatibility baseline that npm 2,036 packages target. Deno, also by Node.js creator Ryan Dahl, runs TypeScript directly and denies file, network and environment access until you grant it with flags such as --allow-read. Bun puts a runtime designed as a drop-in replacement for Node.js, a package manager, a test runner and a bundler in one executable. Each runtime exposes its own global, so a script can tell where it runs:
const runtime =
typeof Deno !== 'undefined' ? `Deno ${Deno.version.deno}` :
typeof Bun !== 'undefined' ? `Bun ${Bun.version}` :
typeof process !== 'undefined' ? `Node.js ${process.versions.node}` :
'a browser';
console.log(`Running on ${runtime}`);
console.log(typeof window, typeof globalThis.setTimeout);Running on Node.js 25.8.0 undefined function
Run it with node runtime.js, deno run runtime.js or bun runtime.js. window exists only in browsers; globalThis (ES2020) names the global object everywhere, and web APIs such as setTimeout(), fetch() and URL exist in all three runtimes.