A Drip of JavaScript 2015-03-26T14:35:02+00:00 Joshua Clanton The Problems with for...in and JavaScript Arrays 2015-03-26T00:00:00+00:00 /blog/drips/the-problem-with-for-in-and-javascript-arrays <p>We&#39;ve talked in the past about different ways of iterating over arrays. But in this drip we&#39;ll take a look at one way <strong>not</strong> to do it.</p> <p>JavaScript&#39;s <code>for</code>...<code>in</code> loop iterates over the enumerable properties of an object like so:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">tMinus</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">two</span><span class="o">:</span> <span class="s2">&quot;Two&quot;</span><span class="p">,</span> <span class="nx">one</span><span class="o">:</span> <span class="s2">&quot;One&quot;</span><span class="p">,</span> <span class="nx">zero</span><span class="o">:</span> <span class="s2">&quot;Blast off!&quot;</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">countdown</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">step</span> <span class="k">in</span> <span class="nx">tMinus</span><span class="p">)</span> <span class="p">{</span> <span class="nx">countdown</span> <span class="o">+=</span> <span class="nx">tMinus</span><span class="p">[</span><span class="nx">step</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">countdown</span><span class="p">);</span> <span class="c1">// =&gt; &quot;Two</span> <span class="c1">// One</span> <span class="c1">// Blast Off!</span> <span class="c1">// &quot;</span> </code></pre></div> <p>Because <code>for</code>...<code>in</code> operates on any JavaScript object, it is also possible to use it with arrays. For example:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">tMinus</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;Two&quot;</span><span class="p">,</span> <span class="s2">&quot;One&quot;</span><span class="p">,</span> <span class="s2">&quot;Blast off!&quot;</span> <span class="p">];</span> <span class="kd">var</span> <span class="nx">countdown</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">step</span> <span class="k">in</span> <span class="nx">tMinus</span><span class="p">)</span> <span class="p">{</span> <span class="nx">countdown</span> <span class="o">+=</span> <span class="nx">tMinus</span><span class="p">[</span><span class="nx">step</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">countdown</span><span class="p">);</span> <span class="c1">// =&gt; &quot;Two</span> <span class="c1">// One</span> <span class="c1">// Blast Off!</span> <span class="c1">// &quot;</span> </code></pre></div> <p>However, there are three problems with using this approach on arrays. First, the <code>for</code>...<code>in</code> also iterates over an object&#39;s prototype properties if those properties are enumerable. For example:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nb">Array</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">voice</span> <span class="o">=</span> <span class="s2">&quot;James Earl Jones&quot;</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">tMinus</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;Two&quot;</span><span class="p">,</span> <span class="s2">&quot;One&quot;</span><span class="p">,</span> <span class="s2">&quot;Blast off!&quot;</span> <span class="p">];</span> <span class="kd">var</span> <span class="nx">countdown</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">step</span> <span class="k">in</span> <span class="nx">tMinus</span><span class="p">)</span> <span class="p">{</span> <span class="nx">countdown</span> <span class="o">+=</span> <span class="nx">tMinus</span><span class="p">[</span><span class="nx">step</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">countdown</span><span class="p">);</span> <span class="c1">// =&gt; &quot;Two</span> <span class="c1">// One</span> <span class="c1">// Blast Off!</span> <span class="c1">// James Earl Jones</span> <span class="c1">// &quot;</span> </code></pre></div> <p>That can be solved by using <code>hasOwnProperty</code> to exclude prototype properties.</p> <p>Array.prototype.voice = &quot;James Earl Jones&quot;;</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nb">Array</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">voice</span> <span class="o">=</span> <span class="s2">&quot;James Earl Jones&quot;</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">tMinus</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;Two&quot;</span><span class="p">,</span> <span class="s2">&quot;One&quot;</span><span class="p">,</span> <span class="s2">&quot;Blast off!&quot;</span> <span class="p">];</span> <span class="kd">var</span> <span class="nx">countdown</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">step</span> <span class="k">in</span> <span class="nx">tMinus</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">tMinus</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">step</span><span class="p">))</span> <span class="p">{</span> <span class="nx">countdown</span> <span class="o">+=</span> <span class="nx">tMinus</span><span class="p">[</span><span class="nx">step</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">countdown</span><span class="p">);</span> <span class="c1">// =&gt; &quot;Two</span> <span class="c1">// One</span> <span class="c1">// Blast Off!</span> <span class="c1">// &quot;</span> </code></pre></div> <p>Second, according to the <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.4">specification</a> <code>for</code>...<code>in</code> loops may iterate over an object&#39;s values in an <strong>arbitrary order</strong>.</p> <p>That&#39;s not really a problem for an ordinary object whose values are inherently unordered anyway. But you probably don&#39;t want your JavaScript engine handing back array values in a random order, because you could get unexpected results like this:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">countdown</span><span class="p">);</span> <span class="c1">// =&gt; &quot;Blast Off!</span> <span class="c1">// One</span> <span class="c1">// Two</span> <span class="c1">// &quot;</span> </code></pre></div> <p>The third problem is that <code>for</code>...<code>in</code> iterates over <strong>all enumerable properties</strong>, not just the array&#39;s elements. As we&#39;ve <a href="http://designpepper.com/blog/drips/storing-metadata-on-arrays-in-javascript.html">discussed before</a>, it is possible to store additional properties on an array. This can also lead to unexpected results.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">tMinus</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;Two&quot;</span><span class="p">,</span> <span class="s2">&quot;One&quot;</span><span class="p">,</span> <span class="s2">&quot;Blast off!&quot;</span> <span class="p">];</span> <span class="nx">tMinus</span><span class="p">.</span><span class="nx">announcer</span> <span class="o">=</span> <span class="s2">&quot;Morgan Freeman&quot;</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">countdown</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">step</span> <span class="k">in</span> <span class="nx">tMinus</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">tMinus</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">step</span><span class="p">))</span> <span class="p">{</span> <span class="nx">countdown</span> <span class="o">+=</span> <span class="nx">tMinus</span><span class="p">[</span><span class="nx">step</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">countdown</span><span class="p">);</span> <span class="c1">// =&gt; &quot;Two</span> <span class="c1">// One</span> <span class="c1">// Blast Off!</span> <span class="c1">// Morgan Freeman</span> <span class="c1">// &quot;</span> </code></pre></div> <p>Because of these problems you will almost never want iterate over arrays with <code>for</code>...<code>in</code> loops. Instead, use an ordinary <code>for</code> loop, or one of the built-in array iteration methods like <code>forEach</code> or <code>map</code>.</p> <p>Now you know one more quirk to avoid as you write safe and clean JavaScript.</p> <p>Thanks for reading!</p> <p>Josh Clanton</p> Measuring JavaScript Performance with console.time 2015-03-10T00:00:00+00:00 /blog/drips/measuring-javascript-performance-with-console-time <p>At one point or another almost every JavaScript developer has to deal with optimizing performance-critical code. But how exactly do you go about it? This drip will show you how to use <code>console.time</code> as a low-cost performance testing tool.</p> <p>First, let&#39;s suppose that we have a scientific application that makes frequent use of the factorial function.</p> <p>If you&#39;re not familiar with the factorial in mathematics, it basically works like this: Any input to the factorial function must be a non-negative integer. The factorial of X is the product of every positive integer less than or equal to X. In other words, the factorial of 3 is 1 * 2 * 3, the factorial of 4 is 1 * 2 * 3 * 4, and so on.</p> <p>Here we have a simple implementation of <code>factorial</code>.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">factorial</span> <span class="p">(</span><span class="nx">num</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">num</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;Number cannot be negative.&quot;</span><span class="p">);</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="nx">num</span> <span class="o">%</span> <span class="mi">1</span> <span class="o">!==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;Number must be an integer.&quot;</span><span class="p">);</span> <span class="p">}</span> <span class="c1">// The base case</span> <span class="k">if</span> <span class="p">(</span><span class="nx">num</span> <span class="o">===</span> <span class="mi">0</span> <span class="o">||</span> <span class="nx">num</span> <span class="o">===</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// The general case</span> <span class="k">return</span> <span class="nx">num</span> <span class="o">*</span> <span class="nx">factorial</span><span class="p">(</span><span class="nx">num</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">factorial</span><span class="p">(</span><span class="mi">4</span><span class="p">));</span> <span class="c1">// =&gt; 24</span> </code></pre></div> <p>In order to optimize <code>factorial</code>, we need to measure its current performance so that we have something to compare against.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">time</span><span class="p">(</span><span class="s2">&quot;factorial test&quot;</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">100000</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="nx">factorial</span><span class="p">(</span><span class="mi">20</span><span class="p">);</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">timeEnd</span><span class="p">(</span><span class="s2">&quot;factorial test&quot;</span><span class="p">);</span> <span class="c1">// =&gt; 512.46ms</span> </code></pre></div> <p>The <code>console.time</code> method starts a timer with the name that you give it. In this case we called our timer <code>&quot;factorial test&quot;</code>. Correspondingly, when the <code>console.timeEnd</code> method is called with the same name, it will halt the timer and log how many milliseconds have elapsed.</p> <p>You&#39;ll note that in order to get roughly accurate performance measurements, I reran the factorial calculation 100,000 times and it still only took about half a second. Modern JavaScript engines running on modern hardware are <strong>fast</strong>.</p> <p>Now let&#39;s try optimizing <code>factorial</code>.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">factorial</span> <span class="p">(</span><span class="nx">num</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">num</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;Number cannot be negative.&quot;</span><span class="p">);</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="nx">num</span> <span class="o">%</span> <span class="mi">1</span> <span class="o">!==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;Number must be an integer.&quot;</span><span class="p">);</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">factorialEquation</span> <span class="p">(</span><span class="nx">num</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// The base case</span> <span class="k">if</span> <span class="p">(</span><span class="nx">num</span> <span class="o">===</span> <span class="mi">0</span> <span class="o">||</span> <span class="nx">num</span> <span class="o">===</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// The general case</span> <span class="k">return</span> <span class="nx">num</span> <span class="o">*</span> <span class="nx">factorialEquation</span><span class="p">(</span><span class="nx">num</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span> <span class="k">return</span> <span class="nx">factorialEquation</span><span class="p">(</span><span class="nx">num</span><span class="p">);</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">time</span><span class="p">(</span><span class="s2">&quot;factorial test&quot;</span><span class="p">);</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">100000</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="nx">factorial</span><span class="p">(</span><span class="mi">20</span><span class="p">);</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">timeEnd</span><span class="p">(</span><span class="s2">&quot;factorial test&quot;</span><span class="p">);</span> <span class="c1">// =&gt; 81.39ms</span> </code></pre></div> <p>The optimization in this case is quite simple. Rather than checking <code>factorial</code>&#39;s inputs every time the equation is recursively called, we have separated out the equation logic from the input checking logic and ensured that the input checks are only run once. The performance improvements are pretty substantial. Our test case goes from half a second to less than one tenth of a second.</p> <p>Keep in mind that the performance characteristics of a given piece of code vary by JavaScript engine, so for real performance tests you should check in each browser you support.</p> <p>It is also important to note that the vast majority of JavaScript code doesn&#39;t need to be heavily optimized. In the general case, readability and maintainability should trump optimization. Generally you will only need to optimize JavaScript that is part of your program&#39;s critical path, and then only if it has been found to be too slow for your use case.</p> <p>The <code>console.time</code> and <code>console.timeEnd</code> methods are available in all modern browsers, including IE 11.</p> <p>Now you have one more tool in your belt to help you put together excellent JavaScript applications.</p> <p>Thanks for reading!</p> <p>Josh Clanton</p> The Perils of Non-Local Mutation 2015-03-09T00:00:00+00:00 /blog/drips/the-perils-of-non-local-mutation <p>One of the most important things to understand about JavaScript is how to deal with the mutable nature of objects. Unlike primitives (strings, numbers, booleans, etc.) objects are subject to modification.</p> <p>Consider this simple example:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">solarSystem</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">planets</span><span class="o">:</span> <span class="mi">9</span><span class="p">,</span> <span class="nx">inhabited</span><span class="o">:</span> <span class="s2">&quot;Earth&quot;</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">homeSystem</span> <span class="o">=</span> <span class="nx">solarSystem</span><span class="p">;</span> <span class="c1">// Scientists reclassify Pluto</span> <span class="nx">homeSystem</span><span class="p">.</span><span class="nx">planets</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">solarSystem</span><span class="p">);</span> <span class="c1">// =&gt; { planets: 8, inhabited: &quot;Earth&quot; }</span> </code></pre></div> <p>In this example, both <code>solarSystem</code> and <code>homeSystem</code> point to the same underlying object. And when the number of planets is modified, that is reflected in both variables.</p> <p>Ordinarily there isn&#39;t much point to explicitly declaring two variables for the same object. However, it is incredibly common to do so <strong>implicitly</strong> when defining a function.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">solarSystem</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">planets</span><span class="o">:</span> <span class="mi">9</span><span class="p">,</span> <span class="nx">inhabited</span><span class="o">:</span> <span class="s2">&quot;Earth&quot;</span> <span class="p">};</span> <span class="kd">function</span> <span class="nx">reclassifyPluto</span> <span class="p">(</span><span class="nx">system</span><span class="p">)</span> <span class="p">{</span> <span class="nx">system</span><span class="p">.</span><span class="nx">planets</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span> <span class="p">}</span> <span class="nx">reclassifyPluto</span><span class="p">(</span><span class="nx">solarSystem</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">solarSystem</span><span class="p">);</span> <span class="c1">// =&gt; { planets: 8, inhabited: &quot;Earth&quot; }</span> </code></pre></div> <p>Here <code>system</code> becomes a reference to <code>solarSystem</code>, which the <code>reclassifyPluto</code> function modifies directly. That may not seem like such a big deal. But it can have far-reaching consequences.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">solarSystem</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">planets</span><span class="o">:</span> <span class="mi">9</span><span class="p">,</span> <span class="nx">inhabited</span><span class="o">:</span> <span class="s2">&quot;Earth&quot;</span> <span class="p">};</span> <span class="kd">function</span> <span class="nx">simulateMarsSettlement</span> <span class="p">(</span><span class="nx">system</span><span class="p">)</span> <span class="p">{</span> <span class="nx">system</span><span class="p">.</span><span class="nx">inhabited</span> <span class="o">=</span> <span class="s2">&quot;Earth &amp; Mars&quot;</span><span class="p">;</span> <span class="k">return</span> <span class="nx">system</span><span class="p">;</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">reclassifyPluto</span> <span class="p">(</span><span class="nx">system</span><span class="p">)</span> <span class="p">{</span> <span class="nx">system</span><span class="p">.</span><span class="nx">planets</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span> <span class="p">}</span> <span class="kd">var</span> <span class="nx">simulatedSystem</span> <span class="o">=</span> <span class="nx">simulateMarsSettlement</span><span class="p">(</span><span class="nx">solarSystem</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">simulatedSystem</span><span class="p">);</span> <span class="c1">// =&gt; { planets: 9, inhabited: &quot;Earth &amp; Mars&quot; }</span> <span class="nx">reclassifyPluto</span><span class="p">(</span><span class="nx">solarSystem</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">solarSystem</span><span class="p">);</span> <span class="c1">// =&gt; { planets: 8, inhabited: &quot;Earth &amp; Mars&quot; }</span> </code></pre></div> <p>Why does <code>solarSystem</code> think that both Earth and Mars are inhabited? Because <code>simulateMarsSettlement</code> directly modified it. Imagine how difficult it would be to debug if there were dozens of functions depending on the <code>solarSystem</code> object which suddenly changed.</p> <p>We could code defensively by <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze">freezing</a> <code>solarSystem</code> so that it can&#39;t be modified. But this would only solve part of our problem. The underlying issue is that the functions are modifying an object which doesn&#39;t &quot;belong&quot; to them.</p> <p>In general it is better to avoid modifying objects which are passed in as function arguments, because you may not know what else is depending on them. If you need a modified version of argument, then creating a copy is probably your best solution.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">solarSystem</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">planets</span><span class="o">:</span> <span class="mi">9</span><span class="p">,</span> <span class="nx">inhabited</span><span class="o">:</span> <span class="s2">&quot;Earth&quot;</span> <span class="p">};</span> <span class="kd">function</span> <span class="nx">simulateMarsSettlement</span> <span class="p">(</span><span class="nx">system</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">simulation</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">planets</span><span class="o">:</span> <span class="nx">system</span><span class="p">.</span><span class="nx">planets</span><span class="p">,</span> <span class="nx">inhabited</span><span class="o">:</span> <span class="nx">system</span><span class="p">.</span><span class="nx">inhabited</span> <span class="p">};</span> <span class="nx">simulation</span><span class="p">.</span><span class="nx">inhabited</span> <span class="o">=</span> <span class="s2">&quot;Earth &amp; Mars&quot;</span><span class="p">;</span> <span class="k">return</span> <span class="nx">simulation</span><span class="p">;</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">reclassifyPluto</span> <span class="p">(</span><span class="nx">system</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">reclassified</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">planets</span><span class="o">:</span> <span class="nx">system</span><span class="p">.</span><span class="nx">planets</span><span class="p">,</span> <span class="nx">inhabited</span><span class="o">:</span> <span class="nx">system</span><span class="p">.</span><span class="nx">inhabited</span> <span class="p">};</span> <span class="nx">reclassified</span><span class="p">.</span><span class="nx">planets</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span> <span class="k">return</span> <span class="nx">reclassified</span><span class="p">;</span> <span class="p">}</span> <span class="kd">var</span> <span class="nx">simulatedSystem</span> <span class="o">=</span> <span class="nx">simulateMarsSettlement</span><span class="p">(</span><span class="nx">solarSystem</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">simulatedSystem</span><span class="p">);</span> <span class="c1">// =&gt; { planets: 9, inhabited: &quot;Earth &amp; Mars&quot; }</span> <span class="c1">// Replace solarSystem with updated version</span> <span class="kd">var</span> <span class="nx">solarSystem</span> <span class="o">=</span> <span class="nx">reclassifyPluto</span><span class="p">(</span><span class="nx">solarSystem</span><span class="p">);</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">solarSystem</span><span class="p">);</span> <span class="c1">// =&gt; { planets: 8, inhabited: &quot;Earth&quot; }</span> </code></pre></div> <p>Note that in this solution we do end up modifying the <code>solarSystem</code> variable. But we do it &quot;locally,&quot; not hidden away inside a function. This keeps our code simple and easy to reason about.</p> <p>Thanks for reading!</p> <p>Josh Clanton</p> Checking Date Equality in JavaScript 2015-02-17T00:00:00+00:00 /blog/drips/checking-date-equality-in-javascript <p>When working with dates, one of a programmer&#39;s most common needs is to check whether one date matches another. And if you&#39;re like most programmers, the first way that you thought of doing it is something like this:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">isChristmas</span> <span class="p">(</span><span class="nx">dateToTest</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">christmas</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="s2">&quot;12/25/2014&quot;</span><span class="p">);</span> <span class="k">return</span> <span class="p">(</span><span class="nx">dateToTest</span> <span class="o">===</span> <span class="nx">christmas</span><span class="p">);</span> <span class="p">}</span> </code></pre></div> <p>Unfortunately, this function will never return <code>true</code>.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isChristmas</span><span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="s2">&quot;12/25/2014&quot;</span><span class="p">)));</span> <span class="c1">// =&gt; false</span> </code></pre></div> <p>The reason it will never return <code>true</code> is because of the way <a href="http://designpepper.com/blog/drips/object-equality-in-javascript">object equality works in JavaScript</a>. Object equality isn&#39;t tested by the internal value of the object, but by identity. In other words, if it isn&#39;t the exact same copy of the <code>Date</code> object, it isn&#39;t considered equal.</p> <p>To make our <code>isChristmas</code> function work, we need to check equality in a different way.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">isChristmas</span> <span class="p">(</span><span class="nx">dateToTest</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">christmas</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="s2">&quot;12/25/2014&quot;</span><span class="p">);</span> <span class="k">return</span> <span class="p">(</span><span class="nx">dateToTest</span><span class="p">.</span><span class="nx">getTime</span><span class="p">()</span> <span class="o">===</span> <span class="nx">christmas</span><span class="p">.</span><span class="nx">getTime</span><span class="p">());</span> <span class="p">}</span> </code></pre></div> <p>Here we compare the return values of <code>getTime</code>. The <code>getTime</code> method returns an integer representing the number of milliseconds since midnight of January 1, 1970 (the beginning of the Unix epoch).</p> <p>And we can see that we now get the correct result.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isChristmas</span><span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="s2">&quot;12/25/2014&quot;</span><span class="p">)));</span> <span class="c1">// =&gt; true</span> </code></pre></div> <p>But if we happen to compare against a <code>Date</code> object that is the same day, but a different hour, we&#39;ll have trouble again.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isChristmas</span><span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="s2">&quot;12/25/2014 12:00&quot;</span><span class="p">)));</span> <span class="c1">// =&gt; false</span> </code></pre></div> <p>In order to take different times on the same day into account we might try checking only the year, month, and date of the month.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">isChristmas</span> <span class="p">(</span><span class="nx">dateToTest</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="nx">dateToTest</span><span class="p">.</span><span class="nx">getFullYear</span><span class="p">()</span> <span class="o">===</span> <span class="mi">2014</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="c1">// getMonth is 0-indexed</span> <span class="p">(</span><span class="nx">dateToTest</span><span class="p">.</span><span class="nx">getMonth</span><span class="p">()</span> <span class="o">===</span> <span class="mi">11</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">dateToTest</span><span class="p">.</span><span class="nx">getDate</span><span class="p">()</span> <span class="o">==</span> <span class="mi">25</span><span class="p">);</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isChristmas</span><span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">(</span><span class="s2">&quot;12/25/2014 12:00&quot;</span><span class="p">)));</span> <span class="c1">// =&gt; true</span> </code></pre></div> <p>Despite the &quot;gotcha&quot; of <code>getMonth</code> returning a 0-indexed number for months, this function now works. However, it doesn&#39;t take into account the complexities of timezones and working with local time versus UTC/GMT time.</p> <p>Because of these complexities, it is generally better to lean on a robust and well-tested library like <a href="http://momentjs.com/">Moment.js</a> to do things like date comparisons.</p> <p>But most importantly, now you know not to count on JavaScript&#39;s equality operators when comparing dates.</p> <p>Thanks for reading!</p> <p>Josh Clanton</p> Detecting Arrays (and other subtypes) vs. Objects in JavaScript 2015-02-07T00:00:00+00:00 /blog/drips/detecting-arrays-vs-objects-in-javascript <p>When writing JavaScript, it is often necessary to detect whether a certain variable is an array or an ordinary object so that you can perform a different set of actions. For instance, consider a function that can be called with an object representing a marathon, or an array of objects representing multiple marathons:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">getListOfMarathonNames</span> <span class="p">(</span><span class="nx">marathons</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">marathons</span> <span class="k">instanceof</span> <span class="nb">Object</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Return an array containing the name of the only</span> <span class="c1">// marathon given.</span> <span class="k">return</span> <span class="p">[</span><span class="nx">marathons</span><span class="p">.</span><span class="nx">name</span><span class="p">];</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">marathons</span> <span class="k">instanceof</span> <span class="nb">Array</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Return an array containing all marathon names.</span> <span class="k">return</span> <span class="nx">marathons</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">race</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">race</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span> <span class="p">});</span> <span class="p">}</span> <span class="p">}</span> </code></pre></div> <p>At a glance, this seems like perfectly reasonable code. Unfortunately, it is hiding a major bug. Let&#39;s test it out to see how it behaves.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">londonMarathon</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;London Marathon&quot;</span><span class="p">,</span> <span class="nx">date</span><span class="o">:</span> <span class="s2">&quot;April 13, 2014&quot;</span> <span class="p">};</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getListOfMarathonNames</span><span class="p">(</span><span class="nx">londonMarathon</span><span class="p">));</span> <span class="c1">// -&gt; [&quot;London Marathon&quot;]</span> </code></pre></div> <p>So far so good.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">moreMarathons</span> <span class="o">=</span> <span class="p">[</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;New York City Marathon&quot;</span><span class="p">,</span> <span class="nx">date</span><span class="o">:</span> <span class="s2">&quot;November 2, 2014&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Chicago Marathon&quot;</span><span class="p">,</span> <span class="nx">date</span><span class="o">:</span> <span class="s2">&quot;October 12, 2014&quot;</span> <span class="p">}</span> <span class="p">];</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getListOfMarathonNames</span><span class="p">(</span><span class="nx">moreMarathons</span><span class="p">));</span> <span class="c1">// -&gt; [undefined]</span> </code></pre></div> <p>What&#39;s going on here? The problem is that our function&#39;s array detection logic is reversed. Because in JavaScript arrays are just a special type of object, it is impossible for our <code>else if</code> to ever be triggered. And since the array we passed in doesn&#39;t have a <code>name</code> property, we end up returning an array containing only an <code>undefined</code> element.</p> <p>In order to correct this logic we need to work in the other direction, first checking whether the input is of the <code>Array</code> subtype before proceeding to check whether it is part of the broader <code>Object</code> type.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">getListOfMarathonNames</span> <span class="p">(</span><span class="nx">marathons</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nx">marathons</span> <span class="k">instanceof</span> <span class="nb">Array</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Return an array containing all marathon names.</span> <span class="k">return</span> <span class="nx">marathons</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">race</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">race</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span> <span class="p">});</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">marathons</span> <span class="k">instanceof</span> <span class="nb">Object</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Return an array containing the name of the only</span> <span class="c1">// marathon given.</span> <span class="k">return</span> <span class="p">[</span><span class="nx">marathons</span><span class="p">.</span><span class="nx">name</span><span class="p">];</span> <span class="p">}</span> <span class="p">}</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getListOfMarathonNames</span><span class="p">(</span><span class="nx">londonMarathon</span><span class="p">));</span> <span class="c1">// -&gt; [&quot;London Marathon&quot;]</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getListOfMarathonNames</span><span class="p">(</span><span class="nx">moreMarathons</span><span class="p">));</span> <span class="c1">// -&gt; [&quot;New York City Marathon&quot;, &quot;Chicago Marathon&quot;]</span> </code></pre></div> <p>And now we have everything working as it should.</p> <p>Of course, this type of error can also occur when trying to detect other types of objects as well, like <code>Date</code>, <code>RegExp</code>, etc. The general rule is to check for the subtype first, only handling <code>Object</code> afterwards.</p> <p>It&#39;s also worth noting that this isn&#39;t a comprehensive test for whether something is an array. While it will work in most cases, if you are working with iframes or objects from another &quot;domain,&quot; <code>instanceof</code> <a href="http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/">isn&#39;t all that useful</a>, and you&#39;ll probably want to use a utility library to handle the checking for you.</p> <p>Thanks for reading!</p> <p>Josh Clanton</p> Finding an Object's Size in JavaScript 2015-01-28T00:00:00+00:00 /blog/drips/finding-an-objects-size-in-javascript <p>When working in JavaScript, we inevitably end up using objects as if they were hash/map data structures. While there are <a href="/blog/drips/using-ecmascript-6-maps.html">new data structures coming</a>, for now we need to just work our way around the hash/map features that JavaScript objects don&#39;t have.</p> <p>One of those little features is a convenient way to tell just how big an object is. Suppose we are doing some analysis of library data and have a set of books and authors that looks like this:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">bookAuthors</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">&quot;Farmer Giles of Ham&quot;</span><span class="o">:</span> <span class="s2">&quot;J.R.R. Tolkien&quot;</span><span class="p">,</span> <span class="s2">&quot;Out of the Silent Planet&quot;</span><span class="o">:</span> <span class="s2">&quot;C.S. Lewis&quot;</span><span class="p">,</span> <span class="s2">&quot;The Place of the Lion&quot;</span><span class="o">:</span> <span class="s2">&quot;Charles Williams&quot;</span><span class="p">,</span> <span class="s2">&quot;Poetic Diction&quot;</span><span class="o">:</span> <span class="s2">&quot;Owen Barfield&quot;</span> <span class="p">};</span> </code></pre></div> <p>As part of our analysis, we send the book authors data to an API. Unfortunately, the API will only accept an object with up to a hundred books at a time. So we need a good way to tell how many books are in an object before trying to send them.</p> <p>Our first inclination might be to try something like this:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">countProperties</span> <span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">property</span> <span class="k">in</span> <span class="nx">obj</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">property</span><span class="p">))</span> <span class="p">{</span> <span class="nx">count</span><span class="o">++</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="nx">count</span><span class="p">;</span> <span class="p">}</span> <span class="kd">var</span> <span class="nx">bookCount</span> <span class="o">=</span> <span class="nx">countProperties</span><span class="p">(</span><span class="nx">bookAuthors</span><span class="p">);</span> <span class="c1">// Outputs: 4</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">bookCount</span><span class="p">);</span> </code></pre></div> <p>While this certainly works, it would be nice to avoid using a hand-rolled method just to count properties. Surely JavaScript has something better available? Fortunately, it does.</p> <p>While it&#39;s not quite as simple as finding the length of an array, it is awfully close. In modern browsers, we can do this:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">bookCount</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">keys</span><span class="p">(</span><span class="nx">bookAuthors</span><span class="p">).</span><span class="nx">length</span><span class="p">;</span> <span class="c1">// Outputs: 4</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">bookCount</span><span class="p">);</span> </code></pre></div> <p>The <code>Object.keys</code> method returns an array of all the object&#39;s own enumerable property keys. And since we are interested in knowing just how many properties there are, we can just check the array&#39;s length.</p> <p>It&#39;s a little indirect, but now we can go about our business and make sure that we only call the API when our book count is below the acceptable threshold.</p> <p>As I mentioned above, the <code>keys</code> method is only available in modern browsers, and is not available in IE8 and below. If you want to use it in those older browsers you can use <a href="https://github.com/es-shims/es5-shim">es5-shim</a> to make it available.</p> <p>Thanks for reading!</p> <p>Josh Clanton</p> Negating Predicate Functions in JavaScript 2015-01-22T00:00:00+00:00 /blog/drips/negating-predicate-functions-in-javascript <p>While you may not have heard the term, chances are you&#39;ve used predicate functions before. A predicate is essentially a function that determines whether something is <code>true</code> or <code>false</code> based on its arguments. It is common (though not necessary) for predicates to be named &quot;isX&quot;, such as <code>isEven</code> or <code>isNumber</code>.</p> <p>Suppose that we have a program which deals with cataloging comic book heroes and villains represented as simple objects:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">superman</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Superman&quot;</span><span class="p">,</span> <span class="nx">strength</span><span class="o">:</span> <span class="s2">&quot;Super&quot;</span><span class="p">,</span> <span class="nx">heroism</span><span class="o">:</span> <span class="kc">true</span> <span class="p">};</span> </code></pre></div> <p>And as part of that program we have a number of predicates that might look something like this:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">isSuperStrong</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">character</span><span class="p">.</span><span class="nx">strength</span> <span class="o">===</span> <span class="s2">&quot;Super&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">isNotSuperStrong</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">character</span><span class="p">.</span><span class="nx">strength</span> <span class="o">!==</span> <span class="s2">&quot;Super&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">isHeroic</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">character</span><span class="p">.</span><span class="nx">heroism</span> <span class="o">===</span> <span class="kc">true</span><span class="p">;</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">isNotHeroic</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">character</span><span class="p">.</span><span class="nx">heroism</span> <span class="o">!==</span> <span class="kc">true</span><span class="p">;</span> <span class="p">}</span> <span class="c1">// Outputs: false</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isNotSuperStrong</span><span class="p">(</span><span class="nx">superman</span><span class="p">));</span> <span class="c1">// Outputs: false</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isNotHeroic</span><span class="p">(</span><span class="nx">superman</span><span class="p">));</span> </code></pre></div> <p>As you can see, this is a bit repetitive. But the problem isn&#39;t that the code is longer. Rather, the problem is that for each pair of predicates (the &quot;is&quot; and &quot;isNot&quot;) we are defining our core logic twice. Having that logic repeated means we are more likely to make mistakes like updating only one of the predicates when our logic changes.</p> <p>What can we do to fix that problem? Our first thought might be to do something like this:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">isSuperStrong</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">character</span><span class="p">.</span><span class="nx">strength</span> <span class="o">===</span> <span class="s2">&quot;Super&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">isNotSuperStrong</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="o">!</span><span class="nx">isSuperStrong</span><span class="p">(</span><span class="nx">character</span><span class="p">);</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">isHeroic</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">character</span><span class="p">.</span><span class="nx">heroism</span> <span class="o">===</span> <span class="kc">true</span><span class="p">;</span> <span class="p">}</span> <span class="kd">function</span> <span class="nx">isNotHeroic</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="o">!</span><span class="nx">isHeroic</span><span class="p">(</span><span class="nx">character</span><span class="p">);</span> <span class="p">}</span> <span class="c1">// Outputs: false</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isNotSuperStrong</span><span class="p">(</span><span class="nx">superman</span><span class="p">));</span> <span class="c1">// Outputs: false</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isNotHeroic</span><span class="p">(</span><span class="nx">superman</span><span class="p">));</span> </code></pre></div> <p>While this is certainly an improvement, we still have repetition of a different kind. Both of our &quot;isNot&quot; predicates share a piece of core logic. They both reverse the sense of the predicates that they are based upon.</p> <p>Wouldn&#39;t it be nice if we could abstract that away into something clearer and more maintainable? Fortunately, we can.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">negate</span> <span class="p">(</span><span class="nx">predicateFunc</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="o">!</span><span class="nx">predicateFunc</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span> <span class="p">};</span> <span class="p">}</span> </code></pre></div> <p>This is another example of treating functions as first-class values in JavaScript. The <code>negate</code> function accepts a predicate as an argument, and returns a function whose sense is the opposite of the original predicate.</p> <p>(If the usage of <code>apply</code> is confusing, you might want to read the <a href="/blog/drips/invoking-javascript-functions-with-call-and-apply">previous drip on call and apply</a>.)</p> <p>Let&#39;s use <code>negate</code> on our original problem.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">isSuperStrong</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">character</span><span class="p">.</span><span class="nx">strength</span> <span class="o">===</span> <span class="s2">&quot;Super&quot;</span><span class="p">;</span> <span class="p">}</span> <span class="kd">var</span> <span class="nx">isNotSuperStrong</span> <span class="o">=</span> <span class="nx">negate</span><span class="p">(</span><span class="nx">isSuperStrong</span><span class="p">);</span> <span class="kd">function</span> <span class="nx">isHeroic</span> <span class="p">(</span><span class="nx">character</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">character</span><span class="p">.</span><span class="nx">heroism</span> <span class="o">===</span> <span class="kc">true</span><span class="p">;</span> <span class="p">}</span> <span class="kd">var</span> <span class="nx">isNotHeroic</span> <span class="o">=</span> <span class="nx">negate</span><span class="p">(</span><span class="nx">isHeroic</span><span class="p">);</span> <span class="c1">// Outputs: false</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isNotSuperStrong</span><span class="p">(</span><span class="nx">superman</span><span class="p">));</span> <span class="c1">// Outputs: false</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">isNotHeroic</span><span class="p">(</span><span class="nx">superman</span><span class="p">));</span> </code></pre></div> <p>Everything continues to work as expected. But now we&#39;ve pulled the shared logic of the &quot;isNot&quot; predicates into one location. And it is much easier to tell at a glance that the definitions of the &quot;isNot&quot; predicates are derived from the &quot;is&quot; predicates.</p> <p>Applied to only a couple of functions, this refactoring may not look like much. But applied to dozens of functions scattered throughout a complex system, <code>negate</code> can help to make things much more maintainable.</p> <p>Both <a href="https://github.com/jashkenas/underscore/blob/a315e9f4473005a8310540b16d565519a9556106/underscore.js#L785">Underscore</a> and <a href="https://github.com/lodash/lodash/blob/6a839967b4beeaf4be0601d75ff4272a18cb5bec/lodash.js#L5259">Lo-Dash</a> will include <code>negate</code> in future versions. It is also available right now as part of <a href="https://github.com/documentcloud/underscore-contrib/blob/4ae487956e054f0e0d8de1a85f47e8e8d2e77f06/underscore.function.combinators.js#L107">Underscore-contrib</a> under the name <code>complement</code>.</p> <p>Thanks for reading!</p> <p>Josh Clanton</p> Using ECMAScript 6 Maps 2015-01-20T00:00:00+00:00 /blog/drips/using-ecmascript-6-maps <p>In last week&#39;s drip I discussed using <code>Object.create(null)</code> in order to simplify creating key-value maps in JavaScript. But even with that approach, objects aren&#39;t a substitute for a full-fledged map data type. For example:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">heroesNemesis</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span> <span class="kd">var</span> <span class="nx">greenLantern</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Green Lantern&quot;</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">sinestro</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Sinestro&quot;</span> <span class="p">};</span> <span class="nx">heroesNemesis</span><span class="p">[</span><span class="nx">greenLantern</span><span class="p">]</span> <span class="o">=</span> <span class="nx">sinestro</span><span class="p">;</span> <span class="c1">// Outputs: { name: &quot;Sinestro&quot; }</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">heroesNemesis</span><span class="p">[</span><span class="nx">greenLantern</span><span class="p">]);</span> <span class="kd">var</span> <span class="nx">wonderWoman</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Wonder Woman&quot;</span> <span class="p">};</span> <span class="c1">// Outputs: { name: &quot;Sinestro&quot; }</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">heroesNemesis</span><span class="p">[</span><span class="nx">wonderWoman</span><span class="p">]);</span> </code></pre></div> <p>Why is our object reporting Wonder Woman&#39;s nemesis as Sinestro? In JavaScript, an object&#39;s keys can only be strings. If you try to supply something else, the JavaScript engine will try to coerce it into a string with <code>toString</code>.</p> <p>And the default <code>toString</code> implementation for an object returns <code>&quot;[object Object]&quot;</code> regardless of what properties the object possesses. So unless we decide to start monkeying around with <code>Object.prototype</code> (generally a bad idea) our &quot;map&quot; object can&#39;t distinguish between different objects as keys.</p> <p>Fortunately, ECMAScript 6 (the next version of JavaScript) includes a new <code>Map</code> data type which allows us to use any valid JavaScript value as a key.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">heroesNemesis</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Map</span><span class="p">();</span> <span class="kd">var</span> <span class="nx">greenLantern</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Green Lantern&quot;</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">sinestro</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Sinestro&quot;</span> <span class="p">};</span> <span class="nx">heroesNemesis</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">greenLantern</span><span class="p">,</span> <span class="nx">sinestro</span><span class="p">);</span> <span class="c1">// Outputs: { name: &quot;Sinestro&quot; }</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">heroesNemesis</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">greenLantern</span><span class="p">));</span> <span class="kd">var</span> <span class="nx">wonderWoman</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Wonder Woman&quot;</span> <span class="p">};</span> <span class="c1">// Outputs: undefined</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">heroesNemesis</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">wonderWoman</span><span class="p">));</span> </code></pre></div> <p>As you can see, <code>Map</code> gives us the result we&#39;d expect. To use <code>Map</code> our main interfaces are <code>set</code> which accepts a key and associated value to store, and <code>get</code> which accepts a key and returns the associated value.</p> <p>When checking to see whether a given key matches, <code>Map</code> uses the &quot;same value&quot; algorithm. So even if two objects look identical, only the original can be used to retrieve it&#39;s associated value. For example:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">clonedLantern</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Green Lantern&quot;</span> <span class="p">};</span> <span class="c1">// Outputs: undefined</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">heroesNemesis</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">clonedLantern</span><span class="p">));</span> </code></pre></div> <p>And you can determine how many elements have been stored in a <code>Map</code> by checking its <code>size</code> property.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="c1">// Outputs: 1</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">heroesNemesis</span><span class="p">.</span><span class="nx">size</span><span class="p">);</span> </code></pre></div> <p>This basic set of functionality for <code>Map</code> is supported in the latest versions of Chrome and FireFox, as well as IE11. In future drips we&#39;ll look into more advanced features of <code>Map</code>.</p> <p>Thanks for reading!</p> <p>Joshua Clanton</p> Creating Objects Without Prototypes 2014-12-30T00:00:00+00:00 /blog/drips/creating-objects-without-prototypes <p>Last drip we talked about inheritance using prototypes and Object.create. But one point that sometimes surprises new JavaScript developers is that even ordinary &quot;empty&quot; objects are already part of an inheritance chain. Consider the following:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">empty</span> <span class="o">=</span> <span class="p">{};</span> <span class="c1">// Outputs: Function Object()</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">empty</span><span class="p">.</span><span class="nx">constructor</span><span class="p">);</span> </code></pre></div> <p>Every time you create a new object via an object literal (the <code>{}</code>), behind the scenes JavaScript invokes the <code>Object</code> constructor to create the object, just as if you&#39;d used <code>new Object()</code>. This is what allows your new object to inherit properties from <code>Object.prototype</code>.</p> <p>But sometimes it would be convenient to create an object that doesn&#39;t inherit from a prototype at all. For instance, if you&#39;d like to use an object as a hash/map of arbitrary keys to values.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">dictionary</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">destructor</span><span class="o">:</span> <span class="s2">&quot;A destructive element&quot;</span> <span class="p">};</span> <span class="kd">function</span> <span class="nx">getDefinition</span><span class="p">(</span><span class="nx">word</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">dictionary</span><span class="p">[</span><span class="nx">word</span><span class="p">];</span> <span class="p">}</span> <span class="c1">// Outputs: &quot;A destructive element&quot;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getDefinition</span><span class="p">(</span><span class="s2">&quot;destructor&quot;</span><span class="p">));</span> <span class="c1">// Outputs: function Object()</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getDefinition</span><span class="p">(</span><span class="s2">&quot;constructor&quot;</span><span class="p">));</span> </code></pre></div> <p>As you can see, our <code>getDefinition</code> function works perfectly for words that we have explicitly defined. However, it also returns inherited properties like <code>constructor</code>.</p> <p>One way of solving this would be to introduce a <code>hasOwnProperty</code> check to make sure that the properties aren&#39;t inherited. But another way is just to ensure that our <code>dictionary</code> never inherits any properties to begin with.</p> <p>Fortunately, <code>Object.create</code> makes that rather easy.</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">dictionary</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="p">{</span> <span class="nx">destructor</span><span class="o">:</span> <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="s2">&quot;A destructive element&quot;</span> <span class="p">}</span> <span class="p">});</span> <span class="kd">function</span> <span class="nx">getDefinition</span><span class="p">(</span><span class="nx">word</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">dictionary</span><span class="p">[</span><span class="nx">word</span><span class="p">];</span> <span class="p">}</span> <span class="c1">// Outputs: &quot;A destructive element&quot;</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getDefinition</span><span class="p">(</span><span class="s2">&quot;destructor&quot;</span><span class="p">));</span> <span class="c1">// Outputs: undefined</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">getDefinition</span><span class="p">(</span><span class="s2">&quot;constructor&quot;</span><span class="p">));</span> </code></pre></div> <p>As you can see, in this case <code>getDefinition</code> returned our intended result.</p> <p>The trick here is in our first argument to <code>Object.create</code>. Normally this is where we would pass in the object that we want to serve as the prototype. But if we pass in <code>null</code> instead, our new object doesn&#39;t inherit from a prototype at all.</p> <p>Of course, <code>Object.create</code> isn&#39;t available in IE8 and older, so you should only use this technique in modern browsers.</p> <p>I hope you found this week&#39;s drip informative!</p> <p>Joshua Clanton</p> Basic Inheritance with Object.create 2014-12-09T00:00:00+00:00 /blog/drips/basic-inheritance-with-object-create <p>A few issues back we looked at <a href="/blog/drips/basic-inheritance-with-javascript-constructors.html">how to implement basic inheritance with constructors</a>. In this issue, we&#39;ll look at how to do the same with the newer <code>Object.create</code>.</p> <p>When using constructors for inheritance, we attach properties to the constructor&#39;s <code>prototype</code> property like so:</p> <p>Here&#39;s a little refresher:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">function</span> <span class="nx">SuperHuman</span> <span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">superPower</span><span class="p">)</span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span> <span class="k">this</span><span class="p">.</span><span class="nx">superPower</span> <span class="o">=</span> <span class="nx">superPower</span><span class="p">;</span> <span class="p">}</span> <span class="nx">SuperHuman</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">usePower</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">superPower</span> <span class="o">+</span> <span class="s2">&quot;!&quot;</span><span class="p">);</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">banshee</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SuperHuman</span><span class="p">(</span><span class="s2">&quot;Silver Banshee&quot;</span><span class="p">,</span> <span class="s2">&quot;sonic wail&quot;</span><span class="p">);</span> <span class="c1">// Outputs: &quot;sonic wail!&quot;</span> <span class="nx">banshee</span><span class="p">.</span><span class="nx">usePower</span><span class="p">();</span> </code></pre></div> <p>The <code>SuperHuman</code> constructor contains our initialization logic, while <code>SuperHuman.prototype</code> contains the methods that are shared across all <code>SuperHuman</code> instances.</p> <p>If we were to implement the same basic logic using <code>Object.create</code>, it would look a bit different:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">superHuman</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">usePower</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">superPower</span> <span class="o">+</span> <span class="s2">&quot;!&quot;</span><span class="p">);</span> <span class="p">}</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">banshee</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">superHuman</span><span class="p">,</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="s2">&quot;Silver Banshee&quot;</span> <span class="p">},</span> <span class="nx">superPower</span><span class="o">:</span> <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="s2">&quot;sonic wail&quot;</span> <span class="p">}</span> <span class="p">});</span> <span class="c1">// Outputs: &quot;sonic wail!&quot;</span> <span class="nx">banshee</span><span class="p">.</span><span class="nx">usePower</span><span class="p">();</span> </code></pre></div> <p>In this case we first define the prototype object <code>superHuman</code>, and then we use <code>Object.create</code> to make a new object which inherits from <code>superHuman</code>. That second argument might look a little strange to you, but it&#39;s just a simple property descriptor object, like we use <a href="/blog/drips/creating-unwritable-properties-with-object-defineproperty">with <code>Object.defineProperty</code> to fine-tune an object&#39;s properties</a>.</p> <p>Now, what if we want to create a new type which inherits from <code>superHuman</code> while adding its own functionality? What would that look like?</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="kd">var</span> <span class="nx">superHero</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">superHuman</span><span class="p">,</span> <span class="p">{</span> <span class="nx">allegiance</span><span class="o">:</span> <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="s2">&quot;Good&quot;</span> <span class="p">},</span> <span class="nx">saveTheDay</span><span class="o">:</span> <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s2">&quot; saved the day!&quot;</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="p">});</span> <span class="kd">var</span> <span class="nx">marvel</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">superHero</span><span class="p">,</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="s2">&quot;Captain Marvel&quot;</span> <span class="p">},</span> <span class="nx">superPower</span><span class="o">:</span> <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="s2">&quot;magic&quot;</span> <span class="p">}</span> <span class="p">});</span> <span class="c1">// Outputs: &quot;Captain Marvel saved the day!&quot;</span> <span class="nx">marvel</span><span class="p">.</span><span class="nx">saveTheDay</span><span class="p">();</span> </code></pre></div> <p>So far so good. But does Captain Marvel have access to the <code>superHuman</code> prototype methods?</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="c1">// Outputs: &quot;magic!&quot;</span> <span class="nx">marvel</span><span class="p">.</span><span class="nx">usePower</span><span class="p">();</span> </code></pre></div> <p>Yes, she does!</p> <p>Using <code>Object.create</code> makes setting up inheritance chains simple because any object can be used as a prototype. However, inheritance managed by <code>Object.create</code> can&#39;t be detected by <code>instanceof</code>. Instead you&#39;ll need to use the <code>isPrototypeOf</code> method, like so:</p> <div class="highlight"><pre><code class="language-javascript" data-lang="javascript"><span class="c1">// Outputs: true</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">superHero</span><span class="p">.</span><span class="nx">isPrototypeOf</span><span class="p">(</span><span class="nx">marvel</span><span class="p">));</span> <span class="c1">// Outputs: true</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">superHuman</span><span class="p">.</span><span class="nx">isPrototypeOf</span><span class="p">(</span><span class="nx">marvel</span><span class="p">));</span> </code></pre></div> <p>Because both <code>superHero</code> and <code>superHuman</code> are part of <code>marvel</code>&#39;s prototype chain, their <code>isPrototypeOf</code> calls each return true.</p> <p>As with other JavaScript features we&#39;ve reviewed, <code>Object.create</code> is a feature of ECMAScript 5 and is not available in older browsers like IE8.</p> <p>That&#39;s our brief introduction to using <code>Object.create</code>. Thanks for reading!</p> <p>Joshua Clanton</p>