I don’t get why JavaScript is single threaded in practice

Doing a quick google search you’ll find that JavaScript is single threaded this means that there is only one process that executes the code sequentially by putting instructions in a single call stack.

Now, in practice this is not the case. With runtime environments like Chrome (which uses the V8 engine) and Node.js (which also uses the V8 engine) it’s possible to have asynchronous code. The execution of that code is offloaded to a separate thread created by that runtime environment (or V8?) rather than trying to use the single thread.

Now the issue is that I’m confused as to what constitutes “JavaScript”. If all JavaScript engine like V8, Gecko, etc… are able to create new threads should we consider JavaScript not single threaded anymore? Or when we say “JavaScript” we refer to the spec that defines the language and not how people decide to implement it?

Another confusion is the difference between the V8 engine and the runtime environment. Is the asynchronous code handled by the V8 engine or the browser itself? Who creates the new thread?

If you tell me who provides the fs API in Node.js it’s clear that this is provided by the runtime environment Node.js and not the JavaScript engine.