<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Javascript on Jake Worth</title><link>https://jakeworth.com/tags/javascript/</link><description>Recent content in Javascript on Jake Worth</description><image><title>Jake Worth</title><url>https://jakeworth.com/twittercard.png</url><link>https://jakeworth.com/twittercard.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 10 Jul 2026 12:04:19 -0400</lastBuildDate><atom:link href="https://jakeworth.com/tags/javascript/index.xml" rel="self" type="application/rss+xml"/><item><title>JavaScript Reflection with toString</title><link>https://jakeworth.com/tils/js-reflection-with-to-string/</link><pubDate>Fri, 10 Jul 2026 12:04:19 -0400</pubDate><guid>https://jakeworth.com/tils/js-reflection-with-to-string/</guid><description>&lt;p&gt;&lt;em&gt;Reflection&lt;/em&gt; is an important tool in programming; it lets us examine a
language&amp;rsquo;s structure. Can we reflect in JavaScript? Sort of.&lt;/p&gt;
&lt;p&gt;Some functions can be reflected with &lt;code&gt;toString()&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;one&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; () =&amp;gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;undefined&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;one&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;() =&amp;gt; 1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Very cool! But native functions only return this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; Math.&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;function max() { [native code] }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You must read the ECMA Script specification to know what the function is
required to do. The actual implementation is written in the JavaScript engine,
likely in another language like C++, which is why Node can&amp;rsquo;t show it via
&lt;code&gt;toString()&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Focus a JS Test</title><link>https://jakeworth.com/tils/focus-a-js-test/</link><pubDate>Fri, 10 Jul 2026 11:48:47 -0400</pubDate><guid>https://jakeworth.com/tils/focus-a-js-test/</guid><description>&lt;p&gt;A vital testing skill is &lt;em&gt;focusing&lt;/em&gt; a test. When iterating on a failing test, we
want that test under microscope.&lt;/p&gt;
&lt;p&gt;The way I do this in JavaScript is &lt;code&gt;.only&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;describe&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;expect&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;} &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;vitest&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; {&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;} &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./sum.js&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;adds 1 + 2 to equal 3&amp;#39;&lt;/span&gt;, () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;expect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)).&lt;span style="color:#a6e22e"&gt;toBe&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;describe&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;only&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;adding fours&amp;#39;&lt;/span&gt;, () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;adds 4 + 4 to equal 8&amp;#39;&lt;/span&gt;, () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;expect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;)).&lt;span style="color:#a6e22e"&gt;toBe&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>JSDoc Deprecations in TypeScript</title><link>https://jakeworth.com/tils/js-doc-deprecations-in-typescript/</link><pubDate>Fri, 10 Jul 2026 10:35:05 -0400</pubDate><guid>https://jakeworth.com/tils/js-doc-deprecations-in-typescript/</guid><description>&lt;p&gt;JSDoc has a &lt;code&gt;@deprecated&lt;/code&gt; tag that you can use in TypeScript, too. Here&amp;rsquo;s an
example.&lt;/p&gt;</description></item><item><title>NPM List Packages</title><link>https://jakeworth.com/tils/npm-list-packages/</link><pubDate>Tue, 07 Jul 2026 10:00:34 -0400</pubDate><guid>https://jakeworth.com/tils/npm-list-packages/</guid><description>&lt;p&gt;When upgrading a dependency for a security issue, we might upgrade and move on:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install &amp;lt;dependency&amp;gt;@&amp;lt;version&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;But wait! Was every &lt;code&gt;&amp;lt;dependency&amp;gt;&lt;/code&gt; version upgraded, or just the version in
&lt;code&gt;package.json&lt;/code&gt;? Check with:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm list // or npm ls
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Node REPL, No Preview</title><link>https://jakeworth.com/tils/node-repl-no-preview/</link><pubDate>Tue, 02 Jun 2026 15:46:17 -0400</pubDate><guid>https://jakeworth.com/tils/node-repl-no-preview/</guid><description>&lt;p&gt;After version v12.17.0, Node&amp;rsquo;s REPL provides a useful preview effect. In this
example, &lt;code&gt;2&lt;/code&gt; is shown in gray &lt;em&gt;before&lt;/em&gt; I hit enter.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zsh" data-lang="zsh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But what if I don&amp;rsquo;t want that? Here&amp;rsquo;s a file called &lt;code&gt;repl&lt;/code&gt; that disables it as an option:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env node
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;repl&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;node:repl&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;repl&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;start&lt;/span&gt;({&lt;span style="color:#a6e22e"&gt;preview&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-zsh" data-lang="zsh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./repl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; + &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No preview.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nodejs.org/api/repl.html#customizing-repl-output"&gt;Docs&lt;/a&gt;&lt;/p&gt;</description></item><item><title>NVM Install and Use Latest LTS</title><link>https://jakeworth.com/tils/nvm-install-and-use-latest/</link><pubDate>Fri, 29 May 2026 13:49:11 -0400</pubDate><guid>https://jakeworth.com/tils/nvm-install-and-use-latest/</guid><description>&lt;p&gt;With my Node versions managed via NVM, I want to be on the latest LTS. You can
ensure that happens with these commands:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ nvm install --lts
$ nvm alias default lts/*
default -&amp;gt; node (-&amp;gt; v24.16.0)
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>JavaScript Wraparound Index</title><link>https://jakeworth.com/tils/javascript-wraparound-index/</link><pubDate>Thu, 07 May 2026 09:44:10 -0400</pubDate><guid>https://jakeworth.com/tils/javascript-wraparound-index/</guid><description>&lt;p&gt;What I call &amp;ldquo;wraparound&amp;rdquo; are repeatable indices on an array. The common use case is a carousel. Here&amp;rsquo;s how it&amp;rsquo;s done:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;items&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;first&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;middle&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;last&amp;#34;&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Our iterable index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// &amp;#34;Next&amp;#34; -&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nextIndex&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;items&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// &amp;lt;- &amp;#34;Previous&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prevIndex&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;items&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;items&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>JavaScript String Concatenation</title><link>https://jakeworth.com/tils/javascript-string-concatenation/</link><pubDate>Wed, 06 May 2026 10:39:46 -0400</pubDate><guid>https://jakeworth.com/tils/javascript-string-concatenation/</guid><description>&lt;p&gt;Here&amp;rsquo;s a periodic reminder that JavaScript supports string concatenation with a plus sign:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;foobar&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>JavaScript Spread a String Into An Array</title><link>https://jakeworth.com/tils/javascript-spread-string-into-array/</link><pubDate>Tue, 05 May 2026 10:49:25 -0400</pubDate><guid>https://jakeworth.com/tils/javascript-spread-string-into-array/</guid><description>&lt;p&gt;Need an array of letters? Here&amp;rsquo;s a trick:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;alpha&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [...&lt;span style="color:#e6db74"&gt;&amp;#39;abcdefghijklmnopqrstuvwxyz&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>JavaScript Array Join Comma Default Separator</title><link>https://jakeworth.com/tils/javascript-array-join-comma-default-separator/</link><pubDate>Tue, 05 May 2026 09:48:19 -0400</pubDate><guid>https://jakeworth.com/tils/javascript-array-join-comma-default-separator/</guid><description>&lt;p&gt;When you join an array in JavaScript, the default separator is a comma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;node&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;j&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;k&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;join&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;j,a,k,e&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>JavaScript Bitwise AND</title><link>https://jakeworth.com/tils/javascript-bitwise-and/</link><pubDate>Fri, 01 May 2026 14:53:41 -0400</pubDate><guid>https://jakeworth.com/tils/javascript-bitwise-and/</guid><description>&lt;p&gt;The JavaScript bitwise AND operator (&lt;code&gt;&amp;amp;&lt;/code&gt;) can be used for some real-world tasks, like testing if a number is odd or even.&lt;/p&gt;</description></item><item><title>Initialize With npm init</title><link>https://jakeworth.com/tils/initialize-with-npm-init/</link><pubDate>Thu, 12 Feb 2026 11:19:46 -0500</pubDate><guid>https://jakeworth.com/tils/initialize-with-npm-init/</guid><description>&lt;p&gt;Most JavaScript projects come with a &lt;code&gt;package.json&lt;/code&gt;. But what if you want to make a new one?&lt;/p&gt;</description></item><item><title>Writing the DOM with fs</title><link>https://jakeworth.com/tils/writing-the-dom-with-fs/</link><pubDate>Fri, 30 Jan 2026 11:12:52 -0500</pubDate><guid>https://jakeworth.com/tils/writing-the-dom-with-fs/</guid><description>&lt;p&gt;How can I output the entire DOM to a file in a JavaScript test?&lt;/p&gt;</description></item><item><title>Rebuilds on Write With Nodemon</title><link>https://jakeworth.com/tils/rebuilds-on-write-with-nodemon/</link><pubDate>Tue, 30 Dec 2025 16:42:28 -0500</pubDate><guid>https://jakeworth.com/tils/rebuilds-on-write-with-nodemon/</guid><description>&lt;p&gt;I&amp;rsquo;ve been hacking on a TypeScript file all day, but I need transpiled JavaScript for any testing. How did I reduce cycle time (and mitigate many chances to forget to build at all)?&lt;/p&gt;</description></item><item><title>npmrc "engine-strict"</title><link>https://jakeworth.com/tils/npm-install-engine-strict/</link><pubDate>Tue, 16 Dec 2025 16:38:36 -0500</pubDate><guid>https://jakeworth.com/tils/npm-install-engine-strict/</guid><description>&lt;p&gt;Suppose your &lt;code&gt;package.json&lt;/code&gt; specifies a Node engine of greater than or equal 24. Does this mean all engineers on your team will use Node 24? No, unless you use this one weird trick!&lt;/p&gt;</description></item><item><title>Learning JavaScript Promises the Feynman Way</title><link>https://jakeworth.com/posts/learning-javascript-promises-the-feynman-way/</link><pubDate>Mon, 25 Aug 2025 12:08:06 -0400</pubDate><guid>https://jakeworth.com/posts/learning-javascript-promises-the-feynman-way/</guid><description>&lt;p&gt;Want to learn a tricky topic and sharpen your learning skills at the same time? In this post, I&amp;rsquo;ll use the Feynman Learning Technique— a method of learning complex things by explaining them simply— with a sprinkle of LLM magic, to deepen my understanding of JavaScript promises.&lt;/p&gt;</description></item><item><title>Editing in Nodes REPL Editor</title><link>https://jakeworth.com/tils/editing-in-nodes-repl-editor/</link><pubDate>Tue, 22 Jul 2025 16:32:43 -0400</pubDate><guid>https://jakeworth.com/tils/editing-in-nodes-repl-editor/</guid><description>&lt;p&gt;The Node REPL has its own editor:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;node
&amp;gt; .editor
// Entering editor mode (Ctrl+D to finish, Ctrl+C to cancel)
const increment = (array) =&amp;gt; array.map(item =&amp;gt; item + 1)
increment([1,2,3])
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Exit and evaluate with Ctrl+D:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[ 2, 3, 4 ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I&amp;rsquo;d use this to experiment with JavaScript API&amp;rsquo;s without leaving my terminal-based IDE.&lt;/p&gt;</description></item><item><title>Why I'm "All In" on TypeScript</title><link>https://jakeworth.com/posts/why-im-all-in-on-typescript/</link><pubDate>Wed, 26 Mar 2025 10:47:45 -0400</pubDate><guid>https://jakeworth.com/posts/why-im-all-in-on-typescript/</guid><description>&lt;p&gt;I&amp;rsquo;ve added TypeScript to several projects I&amp;rsquo;ve worked on. In this post, I&amp;rsquo;d like to discuss why I think TypeScript is essential and document my expectations around it.&lt;/p&gt;</description></item><item><title>Load a Dependency in the Node REPL</title><link>https://jakeworth.com/tils/load-a-dependency-in-node-repl/</link><pubDate>Thu, 11 Jul 2024 10:42:11 -0400</pubDate><guid>https://jakeworth.com/tils/load-a-dependency-in-node-repl/</guid><description>&lt;p&gt;Exploring your JS dependencies locally is a great way to learn and experiment. Here&amp;rsquo;s
how to load a dependency from your &lt;code&gt;/node_modules&lt;/code&gt; directory into the Node REPL.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ node
&amp;gt; cn = require(&amp;#39;classnames&amp;#39;)
&amp;gt; cn(&amp;#34;always&amp;#34;, { never: false, sometimes: true })
&amp;#39;always sometimes&amp;#39;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Absolute Imports in TypeScript and React: A Practical Guide</title><link>https://jakeworth.com/posts/the-joy-of-javascript-absolute-imports/</link><pubDate>Tue, 02 May 2023 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/the-joy-of-javascript-absolute-imports/</guid><description>&lt;p&gt;Absolute imports are an essential developer experience feature for me in any JavaScript application. In this post, I&amp;rsquo;ll explain what they are, how to use them, and why they matter.&lt;/p&gt;</description></item><item><title>Sorting Numbers with JavaScript's sort Function</title><link>https://jakeworth.com/tils/sorting-numbers-with-javascripts-sort-function/</link><pubDate>Fri, 10 Feb 2023 10:04:55 -0500</pubDate><guid>https://jakeworth.com/tils/sorting-numbers-with-javascripts-sort-function/</guid><description>&lt;p&gt;Today in &amp;ldquo;Let JavaScript Surprise You&amp;rdquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;array&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;array&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;😳 The numbers are not sorted as we might expect. What&amp;rsquo;s going on here? From
Mozilla&amp;rsquo;s &lt;a href="http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort"&gt;docs&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The default sort order is ascending, built upon converting the elements into
strings, then comparing their sequences of UTF-16 code units values.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now this sorting makes sense! Luckily, &lt;code&gt;sort&lt;/code&gt; accepts a function, so here&amp;rsquo;s the sorting
we intended:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sortNumbers&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;first&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;second&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;first&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;second&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;array&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sortNumbers&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>How to Create a Timer or Polling in React with setInterval</title><link>https://jakeworth.com/posts/how-to-create-a-simple-timer-in-react-with-setinterval/</link><pubDate>Thu, 29 Dec 2022 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/how-to-create-a-simple-timer-in-react-with-setinterval/</guid><description>&lt;p&gt;Have you ever wanted to create a timer in a React app? This could be in support
of a UI timer or polling. In this post, I&amp;rsquo;ll explain how to create a timer
effect in a React application using hooks and &lt;code&gt;setInterval&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Build a Sentence from a JavaScript Array</title><link>https://jakeworth.com/tils/build-a-sentence-from-a-javascript-array/</link><pubDate>Thu, 22 Dec 2022 09:12:08 -0500</pubDate><guid>https://jakeworth.com/tils/build-a-sentence-from-a-javascript-array/</guid><description>&lt;p&gt;Have you ever wanted to take a JavaScript array of strings and turn them into a
sentence? Here&amp;rsquo;s how you do that.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;toLearn&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;object-oriented programming&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;frontend engineering&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;testing&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sentence&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Intl&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ListFormat&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;format&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;toLearn&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;object-oriented programming, frontend engineering, and testing&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ListFormat&lt;/code&gt; takes &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat"&gt;options&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This has cross-browser support! The days of building a &amp;rsquo;to sentence&amp;rsquo; function
in JavaScript are over.&lt;/p&gt;</description></item><item><title>Logging an Object in JavaScript</title><link>https://jakeworth.com/posts/logging-an-object/</link><pubDate>Thu, 07 Jul 2022 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/logging-an-object/</guid><description>&lt;p&gt;When printing a JavaScript value to the console, I suggest using an object
literal over the raw value.&lt;/p&gt;</description></item><item><title>Only One Way Out of a Function</title><link>https://jakeworth.com/posts/one-way-out-of-a-function/</link><pubDate>Mon, 02 May 2022 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/one-way-out-of-a-function/</guid><description>&lt;p&gt;A programming style I try to practice could be described as: &amp;ldquo;there should be
only one way out of a function.&amp;rdquo; Early returns can often cause more confusion
than they&amp;rsquo;re worth. When possible, I avoid them in favor of a single return.&lt;/p&gt;</description></item><item><title>How to Organize JavaScript Imports</title><link>https://jakeworth.com/posts/javascript-import-opinions/</link><pubDate>Mon, 30 Aug 2021 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/javascript-import-opinions/</guid><description>&lt;p&gt;The &lt;code&gt;import&lt;/code&gt; statements at the top of a JavaScript component file can be a
confusing, duplicative, churning mess. Is there a way to organize them that
makes sense and scales? In this post, I&amp;rsquo;d like to share the way I handle this detail.&lt;/p&gt;</description></item><item><title>How I Clean Up JavaScript Dependencies</title><link>https://jakeworth.com/posts/how-i-clean-up-unused-javascript-dependencies/</link><pubDate>Mon, 03 Aug 2020 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/how-i-clean-up-unused-javascript-dependencies/</guid><description>&lt;p&gt;Unused dependencies are bad: they increase the size of your project, slow down
your processes, require upgrades, and send incorrect messages to fellow
developers about what&amp;rsquo;s important. Make your project better by periodically auditing your dependencies, and
removing those that are unused.&lt;/p&gt;</description></item><item><title>JavaScript Equality</title><link>https://jakeworth.com/posts/javascript-equality/</link><pubDate>Tue, 17 Jul 2018 00:00:00 +0000</pubDate><guid>https://jakeworth.com/posts/javascript-equality/</guid><description>&lt;p&gt;A few weeks ago, I built an app with React.js and create-react-app that I call
&amp;lsquo;JavaScript Equality&amp;rsquo;. &lt;a href="https://javascript-equality.vercel.app/"&gt;View deployment here&lt;/a&gt;. This application demonstrates the JavaScript value-comparison operators &lt;code&gt;==&lt;/code&gt;
and &lt;code&gt;===&lt;/code&gt;. It&amp;rsquo;s inspired by the &lt;a href="https://dorey.github.io/JavaScript-Equality-Table/"&gt;JavaScript Equality Table&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Build URLs with Window Location</title><link>https://jakeworth.com/tils/build-urls-with-window-location/</link><pubDate>Wed, 23 Sep 2015 21:45:56 -0500</pubDate><guid>https://jakeworth.com/tils/build-urls-with-window-location/</guid><description>&lt;p&gt;Want to build URLs with JavaScript? Try the&lt;code&gt;window.location&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;This came from a React.js project we&amp;rsquo;re working on. It uses ES6 template string interpolation, which isn&amp;rsquo;t necessary but definitely is nice:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;`${window.location.protocol}//${window.location.host}/posts/${this.props.postID}/edit`
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Which becomes:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;https://secret-project.com/posts/42/edit&amp;#34;
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>