Is the argument a dictionary?<p><pre><code>    if (a instanceof Array) ...

    &#x2F;&#x2F; or polyfill
    Array.isArray = Array.isArray || function(a) { 
      return a instanceof Array; 
    };
</code></pre>
Object.keys can be cleanly shimmed without braking older browsers.  You can always shim in the behavior you want, as long as you don&#x27;t need IE7 support.<p><pre><code>    Object.prototype.values = function() {
      var instance = this;
      return Object.keys(this).map(function(key){
        return instance[key];
      });
    }
</code></pre>
Replacing globally in a string<p><pre><code>    console.log(&quot;I lose and lose again, not even close.&quot;.replace(&#x2F;\blose\b&#x2F;g, &quot;win&quot;));
</code></pre>
If you&#x27;re using ES6 or node-style modules, you shouldn&#x27;t generally mess with global state, unless you are polyfilling new features.  Promises (bluebird), fetch, etc...<p>Understanding falsy values is a core part of learning JS, as is coercion... no it isn&#x27;t perfect, but there are flaws in any language you can bring up.<p>As to a function assigned to a variable vs a function declaration, well again that&#x27;s part of learning the language.... Being able to use functions as first class expressions is a <i>very</i> powerful feature, that frankly works pretty well.<p>Of the features missing from JS proper, an isolated invokable web-workers scenario with plain, side effect free functions&#x2F;modules would be a great start (not the current way via secondary script).<p>That said, most of your complaints are things that are easier to work around, or simply things that you learn with the language.  It&#x27;s not that different from learning warts in Python (which is better than many), C#, Java or anything else.