<rss version="2.0"><channel><description>undefined</description><title>wtfjs</title><generator>http://github.com/brianleroux/node-code-blog</generator><link>http://wtfjs.com/</link><item><title>im not a number really</title><description><p>You've probably seen this one here before. NaN (<strong>N</strong>ot <strong>a</strong> <strong>N</strong>umber) suffers from a terrible case of self-deception.</p>

<pre><code><span class="pln"><br />&#160; &#160; </span><span class="kwd">typeof</span><span class="pln"> </span><span class="kwd">NaN</span><span class="pln"><br />&#160; &#160; </span><span class="com">//=&gt; number</span><span class="pln"><br /></span></code></pre>

<p>--- <a href="http://twitter.com/3rdEden">@3rdEden</a></p>

<p>Its still hilarious. Now, check this out:</p>

<pre><code><span class="pln"><br />&#160; &#160; </span><span class="lit">3.</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">();</span><span class="pln"><br />&#160; &#160; </span><span class="com">// "3"</span><span class="pln"><br /></span></code></pre>

<p><a href="http://stackoverflow.com/questions/1995113/strangest-language-feature/3297392#3297392">Explanation here.</a></p>

<p>(By way of the wtfjs twitter firehouse. Cheers: <a href="http://twitter.com/devongovett">@devongovett</a>, <a href="http://twitter.com/getify">@getify</a>, <a href="http://twitter.com/mahemoff">@mahemoff</a>. <a href="http://twitter.com/cramforce">@cramforce</a>, <a href="http://twitter.com/mathias">@mathias</a>!)</p></description><link>http://wtfjs.com/2010/07/23/im-not-a-number-really</link><guid>http://wtfjs.com/2010/07/23/im-not-a-number-really</guid><pubDate>Fri Jul 23 2010 00:00:00 GMT+0000 (UTC)</pubDate></item><item><title>magic increasing number</title><description><p>Look at me, I'm the magic increasing number!</p>

<pre><code><span class="pln"><br />&#160; &#160; </span><span class="lit">9999999999999999</span><span class="pln"><br />&#160; &#160; </span><span class="com">//=&gt; 10000000000000000</span><span class="pln"><br /></span></code></pre>

<p>--- <a href="http://twitter.com/thomasfuchs">@thomasfuchs</a></p></description><link>http://wtfjs.com/2010/07/22/magic-increasing-number</link><guid>http://wtfjs.com/2010/07/22/magic-increasing-number</guid><pubDate>Thu Jul 22 2010 00:00:00 GMT+0000 (UTC)</pubDate></item><item><title>typeof number is not number</title><description><p>How do you determine if a number is an integer in JavaScript?</p>

<pre><code><span class="pln"><br />&#160; &#160; x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"><br />&#160; &#160; <br />&#160; &#160; x </span><span class="pun">===</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">floor</span><span class="pun">(</span><span class="pln">x</span><span class="pun">);</span><span class="pln"><br />&#160; &#160; </span><span class="com">// returns true</span><span class="pln"><br /></span></code></pre>

<p>But what happens if we try to add a method for this to the Number prototype?</p>

<pre><code><span class="pln"><br />&#160; &#160; </span><span class="typ">Number</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">isInteger </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />&#160; &#160; &#160; </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">floor</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln"><br />&#160; &#160; </span><span class="pun">}</span><span class="pln"><br />&#160; &#160; <br />&#160; &#160; x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"><br />&#160; &#160; <br />&#160; &#160; x</span><span class="pun">.</span><span class="pln">isInteger</span><span class="pun">();</span><span class="pln"><br />&#160; &#160; </span><span class="com">// returns false!</span><span class="pln"><br /></span></code></pre>

<p>Why? It turns out that when you add methods to Number, the type of the number inside the method becomes "object" rather than "number", but Math.floor returns a result of type "number". If you use the === operator, the two values are no longer equal because they're different types. So the method can be fixed two ways.</p>

<p>Solution 1 is to avoid comparing types:</p>

<pre><code><span class="pln"><br />&#160; &#160; </span><span class="typ">Number</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">isInteger </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />&#160; &#160; &#160; </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">floor</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln"><br />&#160; &#160; &#160; </span><span class="com">// works but breaks if you care about 0 vs other falsy values</span><span class="pln"><br />&#160; &#160; </span><span class="pun">}</span><span class="pln"><br /></span></code></pre>

<p>Solution 2 is better; cast "this" to the Number type and then the types are equal.</p>

<pre><code><span class="pln"><br />&#160; &#160; </span><span class="typ">Number</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">isInteger </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br />&#160; &#160; &#160; </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Number</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">floor</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln"><br />&#160; &#160; </span><span class="pun">}</span><span class="pln"><br /></span></code></pre>

<p>--- <a href="http://twitter.com/attaboy">@attaboy</a></p></description><link>http://wtfjs.com/2010/07/15/typeof-number-is-not-number</link><guid>http://wtfjs.com/2010/07/15/typeof-number-is-not-number</guid><pubDate>Thu Jul 15 2010 00:00:00 GMT+0000 (UTC)</pubDate></item><item><title>fail</title><description><p>Let's take the last post a step further:</p>

<pre><code><span class="pln"><br />&#160; &#160; console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> </span><span class="pun">(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="com">// "fail"</span><span class="pln"><br /></span></code></pre>

<p>Breaking that mass of symbols into pieces we notices, that the following patten occurs often:</p>

<pre><code><span class="pln"><br />&#160; &#160; console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> </span><span class="pun">(![]+[])</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="com">// "false"</span><span class="pln"><br />&#160; &#160; console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> </span><span class="pun">![]</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="com">// false</span><span class="pln"><br /></span></code></pre>

<p>So we try adding <code>[]</code> to <code>false</code>. But through a number of internal function calls( <code>binary + Operator</code> -> <code>ToPrimitive</code> -> <code>[[DefaultValue]]</code>) we end up with converting the right operand to a String:</p>

<pre><code><span class="pln"><br />&#160; &#160; console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> </span><span class="pun">[].</span><span class="pln">toString</span><span class="pun">()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="com">// ""</span><span class="pln"><br />&#160; &#160; console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> </span><span class="pun">(![]+[].</span><span class="pln">toString</span><span class="pun">())</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="com">// false + ""</span><span class="pln"><br /></span></code></pre>

<p>Aha, so we are concatenating strings here! Now this is plain obvious! Moving on to the next bit:</p>

<pre><code><span class="pln"><br />&#160; &#160; console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> </span><span class="pun">[+[]]</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="com">// [ 0]</span><span class="pln"><br />&#160; &#160; console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln"> </span><span class="pun">+[]</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="com">// 0</span><span class="pln"><br /></span></code></pre>

<p>Thinking of a <code>String</code> as an <code>Array</code> we can access its first character via <code>[0]</code>. So <code>"false"[0]</code> returns <code>"f"</code>.</p>

<p>I think you got the idea now and can figure out the rest by yourself!</p>

<p>Thanks to Mathias Bynens for <a href="http://james.padolsey.com/javascript/another-javascript-quiz/#comment-28938">pushing this out int the web</a>.</p></description><link>http://wtfjs.com/2010/07/12/fail</link><guid>http://wtfjs.com/2010/07/12/fail</guid><pubDate>Mon Jul 12 2010 00:00:00 GMT+0000 (UTC)</pubDate></item><item><title>length of what now</title><description><p>This made me laugh. Out loud even!</p>

<pre><code><span class="pln"><br />&#160; &#160; console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">((!+[]+[]+![]).</span><span class="pln">length</span><span class="pun">);</span><span class="pln"><br />&#160; &#160; </span><span class="com">// 9</span><span class="pln"><br /></span></code></pre>

<p>Huh, wtf?! Lets see what we're getting the length of...</p>

<pre><code><span class="pln"><br />&#160; &#160; console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">((!+[]+[]+![]));</span><span class="pln"><br />&#160; &#160; </span><span class="com">// "truefalse"</span><span class="pln"><br /></span></code></pre>

<p>Ah! lulz. thanks to <a href="http://twitter.com/stepiiik">@stepiiik</a> and <a href="http://twitter.com/DavidGrudl">@DavidGrudl</a>!</p></description><link>http://wtfjs.com/2010/07/11/length-of-what-now</link><guid>http://wtfjs.com/2010/07/11/length-of-what-now</guid><pubDate>Sun Jul 11 2010 00:00:00 GMT+0000 (UTC)</pubDate></item></channel></rss>