I use JS every day; I would say I like it. I would even say that in 2020, if you know what you're doing, it's a pretty good language on the whole.
But I don't think it's controversial to say that the following were objectively bad decisions (in hindsight, of course, but still):
- Automatic casting behavior between the core types (you're the only person I've ever heard suggest that this might be a good thing)
- Automatic semicolon insertion
- A core Date object that lacks basic control over time-zones and reasoning about time-zones
- Assigning to an undeclared variable silently creates a global
- Allowing duplicate function parameter names where later ones just hide the earlier ones
- Distinction between undefined and null (this one might have a few defenders)
Some of these are now prevented by "strict mode". Others have been patched-over, for example by the addition of === which prevents casting behavior for comparisons at least. Others can be bridged by libraries (Moment.js) or by best-practices (use foo == null to smooth over the null/undefined distinction, never use a value's implicit falsiness in a conditional, etc).
But the point is that JavaScript has this giant asterisk that will never go away, of things you need to do/avoid/utilize in order to get the most basic behaviors right.