Skip to main content
The js utility is a command-line JavaScript interpreter that implements the ECMAScript specification. It provides both a REPL (Read-Eval-Print Loop) for interactive JavaScript execution and script execution capabilities.

Usage

Basic syntax

js [options] [scripts...]

Interactive REPL

Launch the REPL by running js without arguments:
js
The REPL provides:
  • Line editing with syntax highlighting
  • Multi-line input support
  • Command history (saved to ~/.js-history)
  • Auto-completion for variables and properties

Execute scripts

js script.js
js script1.js script2.js  # Concatenates sources

Evaluate inline code

js -c "console.log('Hello, World!')"

Command-line options

Script execution options

OptionDescription
-c, --evaluate <script>Evaluate the provided string as JavaScript code
-m, --as-moduleTreat input as an ES module instead of a script
-p, --parse-onlyParse the script without executing it
-l, --print-last-resultPrint the last expression result

Debugging options

OptionDescription
-A, --dump-astPrint the Abstract Syntax Tree
-d, --dump-bytecodePrint the compiled bytecode
-i, --disable-ansi-colorsDisable colored output
-h, --disable-source-location-hintsDisable source location hints in errors
-g, --gc-on-every-allocationRun garbage collection after every allocation (for testing)
--disable-debug-outputDisable debug output

Display options

OptionDescription
-s, --no-syntax-highlightDisable live syntax highlighting in REPL
-r, --raw-stringsDisplay strings without quotes or escape sequences

Test262 support

OptionDescription
--use-test262-globalUse Test262 global object ($262) for test compatibility
The --use-test262-global option enables the Test262 global object, which provides functions like $262.createRealm() and $262.evalScript() required by the official ECMAScript Test262 suite.

REPL commands

The REPL provides several built-in commands:

exit([code])

Exit the REPL with an optional exit code (defaults to 0).
exit()
exit(1)  // Exit with error code

help()

Display available REPL commands.
help()
Pretty-print a JavaScript value.
print({ name: "Ladybird", version: 1.0 })

loadINI(file)

Load an INI file and return its contents as a JavaScript object.
const config = loadINI("config.ini")

loadJSON(file)

Load and parse a JSON file.
const data = loadJSON("data.json")

save(file)

Save REPL input history to a file.
save("session.js")

Special variables

_

Access the result of the last expression:
> 2 + 2
4
> _ * 2
8
Assigning to _ disables the automatic last value tracking. You’ll need to restart the REPL to re-enable it.

global

Reference to the global object:
global.myVar = 42

Examples

Running a JavaScript file

js calculator.js

Executing code with modules

js --as-module module.js

Debugging bytecode

js --dump-bytecode --dump-ast script.js

Testing with raw output

js --disable-ansi-colors --print-last-result script.js

Interactive exploration

js
> const arr = [1, 2, 3, 4, 5]
> arr.map(x => x * 2)
[2, 4, 6, 8, 10]
> _
[2, 4, 6, 8, 10]
> save("my-session.js")

Features

Syntax highlighting

The REPL automatically highlights JavaScript syntax:
  • Keywords in blue
  • Strings in green
  • Numbers in magenta
  • Control keywords in cyan
  • Identifiers in white
Disable syntax highlighting with the --no-syntax-highlight option if you’re piping output or prefer plain text.

Error reporting

Detailed error messages with source location:
> function test() { return x; }
> test()
Uncaught exception: ReferenceError: x is not defined
    at test (REPL:1:24)

Multi-line input

The REPL automatically handles multi-line expressions:
> function factorial(n) {
.     if (n <= 1) return 1;
.     return n * factorial(n - 1);
. }
> factorial(5)
120

Promise tracking

The interpreter warns about unhandled promise rejections:
> Promise.reject("error")
WARNING: A promise was rejected without any handlers (result: error)

Implementation details

Global objects

The js utility provides two global object types:
  1. ReplObject - Used in REPL mode, includes REPL-specific functions
  2. ScriptObject - Used in script mode, minimal global environment

JavaScript engine

The utility uses LibJS, Ladybird’s JavaScript engine:
  • Full ECMAScript support
  • Bytecode compilation and interpretation
  • Garbage collection
  • ES modules support

Console object

Full console API support:
console.log("Message")
console.warn("Warning")
console.error("Error")
console.table([{a: 1}, {a: 2}])
console.group("Group")

Platform support

Windows: REPL functionality is not supported on Windows due to LibLine dependency. Script execution works normally.
Linux/macOS: Full support including REPL with line editing and history.
  • test262-runner - Automated Test262 test suite runner
  • wasm - WebAssembly runtime with JavaScript integration

Source code

Source file: Utilities/js.cpp

Build docs developers (and LLMs) love