There also are low.js and Moddable:
https://www.neonious.com/lowjs/
Low.js interprets the actual JS code stored on the embedded system which already contains the runtime. Moddable compiles JS to a byte code on the PC and builds an image to transfer to the embedded chip. The XS runtime of Moddable probably is closer to a full development pipeline, for people used to low-level embedded development.
Low.js was more high-level, when I tried it you did not need to know anything about embedded, just send JS code to the embedded system with low.js on it. Moddable required full knowledge of C and embedded development.
Moddable directly supports almost all of ES 2018.
Low.js uses Duktape with their own stuff added and last time I checked required transpilation of the JS code to ES5.
Duktape and Jerryscript are way bigger open-source projects (on github at least). I used almost all of the interpreters to do a hello world on a microcontroller. They all work great! I found Duk to have a slightly cleaner API for bindings, for example writing to the serial port from JS land.