Its clearly an interpreted language with a simple syntax. That makes it easy to learn.
However, there have been alot of changes using the ES* process. Each version adds some new functionality, sometimes a little sometimes alot. Sometimes just enhancing a few APIs sometimes making large changes, such as adding module systems.
I was doing some work in scala.js the other day, along with nodejs+express+mssql+typescript for the backend. I could have written the backend in scala.jvm but there was no compelling reason to do that as there was some json manipulation and I find js to be easier to use when json is involved. You can avoid alot of encoders/decoder type coding when using scala.js and that just makes it much easier (whether you are in scala.js or typescript).
In other words, other non-language related components, an editor, a process monitor/restarter, can make up for whether a language supports these features or not. The more “jobs” you want the language to support, the large and more complex the language, and vice-versa. The language can be shrunk/expanded based on the target environment it will run in (for dev or prod) and the resources and capabilities of that environment. Since a full solution is more than just a programming language, you can never evaluate a programming language separate from the range of target environment it will run in. It’s like a balloon, squeeze in one place and the other part of the balloon becomes larger.
That’s also why many of the conversations about the best programming languages are a waste of time. Without evaluating the programming language with the environment, including the people/human part–all three dimensions–it is not a useful conversation because it will miss important factors that go into the outcome. It’s really quite easy to figure out. For example, some people talk about small teams with “super tools” can be highly productive, more so than large teams. And that can be true with the right combination programming language, dev/prod target environments and people. In this case, something like lisp, which supports a dynamic development and deployment environment, could be very useful and appropriate. But in other situations that may not be best answer. What confuses some people, I think, is that the boundaries between these segments can greatly overlap giving you multiple options.
Makes me scratch my head a bit…but not too hard.