Maybe a silly question, but if js is such a complete language, why are there so many js frameworks being developed all the time, all seemingly with the goal of making it easier to do fairly basic tasks with js?
Elegance and completeness are two different things. But to answer your question anyway, I would say a framework's goals are more specific than the language's.
For example, Python serves both the data science community and the embedded community. The two have wildly different goals, and thus, different frameworks to achieve "fairly basic tasks [for their domain]".
JS serves so many different communities/domains, which is why there are so many frameworks. Larger audience, with even more different needs. The fact it can serve so many different audiences is a testament to its elegance.
For example, Python serves both the data science community and the embedded community. The two have wildly different goals, and thus, different frameworks to achieve "fairly basic tasks [for their domain]".
JS serves so many different communities/domains, which is why there are so many frameworks. Larger audience, with even more different needs. The fact it can serve so many different audiences is a testament to its elegance.