The (only?) redeeming part about Javascript is that it teaches you how great callback functions are :v I find that I never ever make my own classes, since it's easier to treat everything as a plain old data object and put the logic in the functions. This is especially true with Underscore.js, which gives you all the nice functions you expect from using Python, like zip() and map() and each() <since for (x in y) in JS is pretty weird> ...
Actually a lot of those are in the Javascript standard now.
map,
filter,
forEach are in ES5 (so IE9+) and checks like
every and
some are in ES6 (Only the bleeding edge browsers atm). I find I don't need underscore/lodash as much now that those exist (See the
MDN on Array for full list). Promises are in ES6 too, which I find work a lot better than callbacks for complex asynchronous operations (as callback hell is very real).
I almost never work on a JS project nowadays without
es5-shim and
es6-shim to add all the shiny new goodness back to older browsers (How I learnt to embrace the madness and start using Promises in IE6).
Though actually, I tend to use Typescript instead whenever possible and managed to make headway with pushing this onto my colleagues at the office even, partly so we can use the ES6 language features like modules, arrow functions, classes (TS even allows for you to specify protected and private access scope).
And of course, partly because I am of the opinion that explicit typing is what makes working on an enterprise-level project that involves more than one developer not sanity-shattering or documentation-heavy (Functions can actually self-document what parameters they expect so you don't need to write a 5 paragraph write-up of every function in a project).
When you aren't being strict about it, standard Javascript is great for quick-and-dirty work. But for proper long-term maintainable projects, you need more rigour than the language can give you.