JS Typprobleme – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self JS Typprobleme Tue, 27 Oct 09 00:43:45 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403520#m1403520 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403520#m1403520 <p>meine JS Kenntnisse sind ein bisschen eingerostet, aber folgendes Typingproblem stell mich vor ein Rätsel</p> <pre><code class="block language-javascript"><span class="token operator"><</span>html<span class="token operator">></span> <span class="token operator"><</span>body<span class="token operator">></span> <span class="token operator"><</span>script<span class="token operator">></span> <span class="token comment">// for ( A in [false,true] ) { </span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token constant">A</span> <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token constant">B</span> <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> document<span class="token punctuation">.</span><span class="token function">writeln</span><span class="token punctuation">(</span><span class="token string">"isNaN(A) "</span><span class="token operator">+</span><span class="token function">isNaN</span><span class="token punctuation">(</span><span class="token constant">A</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> document<span class="token punctuation">.</span><span class="token function">writeln</span><span class="token punctuation">(</span><span class="token string">"isNaN(B) "</span><span class="token operator">+</span><span class="token function">isNaN</span><span class="token punctuation">(</span><span class="token constant">B</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* A=Number(A); B=Number(B); */</span> document<span class="token punctuation">.</span><span class="token function">writeln</span><span class="token punctuation">(</span><span class="token string">"<br>"</span><span class="token operator">+</span><span class="token constant">A</span><span class="token operator">+</span><span class="token string">"&&"</span><span class="token operator">+</span><span class="token constant">B</span><span class="token operator">+</span><span class="token string">" -> "</span><span class="token operator">+</span> <span class="token punctuation">(</span><span class="token constant">A</span> <span class="token operator">&&</span> <span class="token constant">B</span> <span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"<br>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> document<span class="token punctuation">.</span><span class="token function">writeln</span><span class="token punctuation">(</span><span class="token string">"<hr> "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token constant">A</span><span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span><span class="token constant">A</span><span class="token operator"><=</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token constant">A</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token constant">B</span><span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span><span class="token constant">B</span><span class="token operator"><=</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token constant">B</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> document<span class="token punctuation">.</span><span class="token function">writeln</span><span class="token punctuation">(</span><span class="token string">"<br>"</span><span class="token operator">+</span><span class="token constant">A</span><span class="token operator">+</span><span class="token string">"&&"</span><span class="token operator">+</span><span class="token constant">B</span><span class="token operator">+</span><span class="token string">" -> "</span><span class="token operator">+</span> <span class="token punctuation">(</span><span class="token constant">A</span> <span class="token operator">&&</span> <span class="token constant">B</span> <span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"<br>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>body<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>html<span class="token operator">></span> </code></pre> <p>ergibt sowohl in FF als auch in Opera</p> <p>isNaN(A) false isNaN(B) false<br> 0&&0 -> 0<br> isNaN(A) false isNaN(B) false<br> 0&&1 -> 1                                <--- HÄ ???<br> isNaN(A) false isNaN(B) false<br> 1&&0 -> 0<br> isNaN(A) false isNaN(B) false<br> 1&&1 -> 1</p> <p>-----------------</p> <p>0&&0 -> 0</p> <p>0&&1 -> 0</p> <p>1&&0 -> 0</p> <p>1&&1 -> 1</p> <p>man beachte dass der auskommentierte Code zum expliziten nummifizieren das Problem behebt....ob A und B aus [true,false} oder [0,1] ändert nix.</p> <p>OK ich hatte die Vermutung das A und B irgendwie Objektreferenzen sind, die komisch numifiziert werden... aber wieso liefert isNaN dann immer false???</p> <p>Bitte öffnet mir die Augen ...</p> <p>Gruß<br>  Rolf</p> JS Typprobleme Tue, 27 Oct 09 01:01:10 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403521#m1403521 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403521#m1403521 <p>OK</p> <p>mein Hirn arbeitet langsam wieder, JS ist kein Perl, "in" liefert mir nicht den value sondern den key im Array-Objekt.</p> <p>Trotzdem verstehe ich noch nicht warum A=0 in der ersten Zeile false und in der zwoten true ist...</p> <p>Cheers<br>   Rolf</p> JS Typprobleme Tue, 27 Oct 09 08:19:17 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403522#m1403522 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403522#m1403522 <blockquote> <p>mein Hirn arbeitet langsam wieder, JS ist kein Perl, "in" liefert mir nicht den value sondern den key im Array-Objekt.</p> </blockquote> <p>Und folglich eine Zeichenkette.</p> <blockquote> <p>Trotzdem verstehe ich noch nicht warum A=0 in der ersten Zeile false und in der zwoten true ist...</p> </blockquote> <p>Weil true && wert => wert und alert(!!"0") => true</p> <p>Struppi.</p> JS Typprobleme Tue, 27 Oct 09 14:37:55 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403523#m1403523 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403523#m1403523 <p>Hi Struppi,</p> <p>short circuit gibts ja auch perl</p> <p>----<a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Logical_Operators" rel="nofollow noopener noreferrer">https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Logical_Operators</a><br> Logical AND (&&) <br> expr1 && expr2 <br> Returns expr1 if it can be converted<br> to false; otherwise, returns expr2. Thus, when used with Boolean values, && returns true if both operands are true; otherwise, returns false.<br> ----</p> <p>aber jetzt kann ich noch mehr schätzen, dass in perl der string "0" false ist!</p> <pre><code class="block language-perl">perl <span class="token operator">-e</span> <span class="token string">'print !!("0"&&"1")'</span> </code></pre> <p>ist false</p> <pre><code class="block language-javascript"><span class="token literal-property property">javascript</span><span class="token operator">:</span><span class="token function">alert</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token operator">!</span><span class="token punctuation">(</span><span class="token string">"0"</span><span class="token operator">&&</span><span class="token string">"1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> </code></pre> <p>ist true</p> <p>Faszinierend!</p> <p>Danke<br>  Rolf</p> JS Typprobleme Tue, 27 Oct 09 14:47:36 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403524#m1403524 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403524#m1403524 <blockquote> <p>aber jetzt kann ich noch mehr schätzen, dass in perl der string "0" false ist!</p> </blockquote> <p>Darüber kann man sich wahrscheinlich streiten, da Perl hier eine doppelte Typkonvertierung macht, während in JS nur eine durchgeführt wird. Von der gewünschten Logik ist hier Perl näher dran, aber ob diese Logik immer gewünscht ist, ist die Frage. Aber vermutlich steht das irgendwo</p> <blockquote> <pre><code class="block language-perl"></code></pre> </blockquote> <p>perl -e 'print !!("0"&&"1")'</p> <blockquote></blockquote> <pre><code class="block"> > ist false > > ~~~javascript javascript:alert(!!("0"&&"1")) > </code></pre> <blockquote> <p>ist true</p> <p>Faszinierend!</p> </blockquote> <p>Wie gesagt, nicht die und-Verknüpfung ist hier entscheidend, sondern der Unterschied von !"0"</p> <p><code class="language-javascript"><span class="token literal-property property">javascript</span><span class="token operator">:</span><span class="token function">alert</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token string">"0"</span><span class="token punctuation">)</span></code> => false<br> <code class="language-perl"><span class="token keyword">print</span> <span class="token operator">!</span><span class="token string">'0'</span> <span class="token operator">?</span> <span class="token string">'true'</span> <span class="token punctuation">:</span> <span class="token string">'false'</span><span class="token punctuation">;</span></code> => true</p> <p>Struppi.</p> JS Typprobleme Tue, 27 Oct 09 16:46:09 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403525#m1403525 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403525#m1403525 <p>Hallo,</p> <blockquote> <p><code class="language-perl"><span class="token keyword">print</span> <span class="token operator">!</span><span class="token string">'0'</span> <span class="token operator">?</span> <span class="token string">'true'</span> <span class="token punctuation">:</span> <span class="token string">'false'</span><span class="token punctuation">;</span></code> => true</p> </blockquote> <p>Nein, false</p> <blockquote> <blockquote> <pre><code class="block language-perl"></code></pre> </blockquote> </blockquote> <p>perl -e 'print !!("0"&&"1")'</p> <blockquote> <blockquote></blockquote> </blockquote> <pre><code class="block"> > > ist false > > > > ~~~javascript javascript:alert(!!("0"&&"1")) > > </code></pre> <blockquote> <blockquote> <p>ist true</p> <p>Faszinierend!</p> </blockquote> </blockquote> <p>Ja: Ein String, der etwas enthält, was kein Whitespace ist, konvertiert in JavaScript immer zu true.<br> Innerhalb von Strings wird fast nichts interpretiert, d.h. eine Null ist dort ein Zeichen wie jedes andere (keine Zahl), daher <code class="language-javascript"><span class="token boolean">true</span></code>.</p> <p>Aber:</p> <pre><code class="block language-javascript"><span class="token function">alert</span><span class="token punctuation">(</span> <span class="token string">"\r\n"</span><span class="token operator">==</span><span class="token boolean">false</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">=></span><span class="token boolean">true</span> <span class="token function">alert</span><span class="token punctuation">(</span> <span class="token operator">!</span><span class="token operator">!</span><span class="token string">"\r\n"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">=></span><span class="token boolean">false</span> </code></pre> <p>Letzteres verstehe, wer will...</p> <p>Gruß, Don P</p> JS Typprobleme Tue, 27 Oct 09 16:55:25 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403526#m1403526 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403526#m1403526 <p>Sorry,</p> <p>Mein letztes Posting ist Quatsch, d.h. <code class="language-javascript"><span class="token boolean">false</span></code>.</p> <p>Aber das ist schon seltsam:</p> <pre><code class="block language-javascript"> <span class="token function">alert</span><span class="token punctuation">(</span> <span class="token string">"\r\n"</span><span class="token operator">==</span><span class="token boolean">false</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">=></span><span class="token boolean">true</span> <span class="token function">alert</span><span class="token punctuation">(</span> <span class="token operator">!</span><span class="token operator">!</span><span class="token string">"\r\n"</span><span class="token operator">==</span><span class="token boolean">false</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">=></span><span class="token boolean">false</span><span class="token punctuation">,</span> aber wieso<span class="token operator">?</span> </code></pre> <p>Gruß, Don P</p> JS Typprobleme Tue, 27 Oct 09 17:00:27 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403527#m1403527 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403527#m1403527 <blockquote> <p>Aber das ist schon seltsam:<br> alert( "\r\n"==false ); =>true</p> </blockquote> <p>Hier wird ein String mit einem bool'schen Wert verglichen.</p> <blockquote> <p>alert( !!"\r\n"==false ); =>false, aber wieso?<br> [/code]</p> </blockquote> <p>Hier zwei Bool'sche werte.</p> <p>"\r\n" wird zu true<br> !"\r\n" wird zu  false<br> !!"\r\n" wird zu true</p> <p>true == false => false</p> <p>Struppi.</p> JS Typprobleme Tue, 27 Oct 09 17:07:18 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403528#m1403528 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403528#m1403528 <p>Hallo,</p> <blockquote> <blockquote> <p>Aber das ist schon seltsam:<br> alert( "\r\n"==false ); =>true</p> </blockquote> <p>Hier wird ein String mit einem bool'schen Wert verglichen.</p> </blockquote> <p>Ja, und der Vergleich ergibt true, d.h. "\r\n" wird zu false (nur Whitespace), und somit<br> false==false =>true</p> <blockquote> <blockquote> <p>alert( !!"\r\n"==false ); =>false, aber wieso?</p> </blockquote> <p>Hier zwei Bool'sche werte.</p> <p>"\r\n" wird zu true</p> </blockquote> <p>Aber oben war es doch false...</p> <blockquote> <p>!!"\r\n" wird zu true</p> </blockquote> <p>Das müsste doch dann auch wieder false ergeben<br> Verstehe ich nicht.</p> <p>Gruß, Don P</p> JS Typprobleme Tue, 27 Oct 09 17:15:11 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403529#m1403529 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403529#m1403529 <blockquote> <blockquote> <blockquote> <p>Aber das ist schon seltsam:<br> alert( "\r\n"==false ); =>true</p> </blockquote> <p>Hier wird ein String mit einem bool'schen Wert verglichen.</p> </blockquote> <p>Ja, und der Vergleich ergibt true, d.h. "\r\n" wird zu false (nur Whitespace), und somit<br> false==false =>true</p> </blockquote> <p>Nein, bei einem Vergleich wird jeder Wert, der kein Leerstring ist, zu einem true:<br> <code class="language-javascript"><span class="token literal-property property">javascript</span><span class="token operator">:</span><span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token operator">?</span><span class="token boolean">true</span><span class="token operator">:</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code> => true</p> <p>Bei einer Umwandlung sieht es anders aus.</p> <blockquote> <blockquote> <blockquote> <p>alert( !!"\r\n"==false ); =>false, aber wieso?</p> </blockquote> <p>Hier zwei Bool'sche werte.</p> <p>"\r\n" wird zu true</p> </blockquote> <p>Aber oben war es doch false...</p> </blockquote> <p>Oben wurde er nicht explizit umgewandelt.</p> <blockquote> <p>Verstehe ich nicht.</p> </blockquote> <p>Die Frage ist wohl, wann ein Wert umgewandelt wird, also welcher Operator zuerst greift.</p> <p>Struppi.</p> JS Typprobleme Tue, 27 Oct 09 17:32:50 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403541#m1403541 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403541#m1403541 <p>Hallo,</p> <blockquote> <p>Nein, bei einem Vergleich wird jeder Wert, der kein Leerstring ist, zu einem true:<br> <code class="language-javascript"><span class="token literal-property property">javascript</span><span class="token operator">:</span><span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token operator">?</span><span class="token boolean">true</span><span class="token operator">:</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code> => true</p> </blockquote> <p>Das ist aber sehr verwirrend. Wie kann dann das sein:<br> <code class="language-javascript"><span class="token function">alert</span><span class="token punctuation">(</span> <span class="token string">'\n'</span><span class="token operator">==</span><span class="token boolean">false</span> <span class="token punctuation">)</span><span class="token punctuation">;</span></code> =>true</p> <p>Hier muss doch '\n' auch zuerst umgewandelt werden, bevor es mit false verglichen wird, und JS behauptet hier doch ganz klar <code class="language-javascript"><span class="token string">'\n'</span><span class="token operator">==</span><span class="token boolean">false</span></code> !</p> <blockquote> <p>Bei einer Umwandlung sieht es anders aus.</p> </blockquote> <p>Micht wirklich: Wenn ich explizit umwandle:<br> <code class="language-javascript"><span class="token function">alert</span><span class="token punctuation">(</span> <span class="token operator">!</span><span class="token string">'\n'</span><span class="token operator">==</span><span class="token boolean">false</span> <span class="token punctuation">)</span><span class="token punctuation">;</span></code> =>true</p> <p>JS behauptet hier also auch das Gegenteil,nämlich <code class="language-javascript"><span class="token operator">!</span><span class="token string">'\n'</span><span class="token operator">==</span><span class="token boolean">false</span></code></p> <p>Daraus folgt messerschaf:<br> <code class="language-javascript"><span class="token string">'\n'</span> <span class="token operator">==</span> <span class="token operator">!</span><span class="token string">'\n'</span></code><br> und siehe:<br> <code class="language-javascript"><span class="token function">alert</span><span class="token punctuation">(</span> <span class="token string">'\n'</span> <span class="token operator">==</span> <span class="token operator">!</span><span class="token string">'\n'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span></code> => true !!</p> <p>*kopfkratz* – Da ist doch etwas faul...</p> <p>Gruß, Don P</p> JS Typprobleme Tue, 27 Oct 09 18:07:13 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403530#m1403530 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403530#m1403530 <p>Hallo,</p> <p>Man also einen String s, der nur Whitespace enthält, dadurch erkennen, dass gilt <code class="language-javascript">s<span class="token operator">==</span><span class="token operator">!</span>s</code> tss...</p> <p>Beweis:</p> <pre><code class="block language-javascript"><span class="token keyword">var</span> <span class="token function-variable function">stringInfo</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">s</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span> s <span class="token operator">==</span> <span class="token operator">!</span>s <span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'Der String enthält nur Whitespace.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'Der String enthält etwas anderes als nur Whitespace, oder ist leer.'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">var</span> a <span class="token operator">=</span> <span class="token string">' \n\r\t '</span><span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">,</span> c <span class="token operator">=</span> <span class="token string">'Text'</span><span class="token punctuation">;</span> <span class="token function">stringInfo</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">stringInfo</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">stringInfo</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Schön schön, aber wer braucht sowas?<br> Ich halte es für einen Bug. Eine solche Unlogik würde man doch keiner Programmiersprache zutrauen...</p> <p>Gruß, Don P</p> JS Typprobleme Tue, 27 Oct 09 18:17:55 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403531#m1403531 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403531#m1403531 <p>Hi,</p> <blockquote> <p>Man also einen String s, der nur Whitespace enthält, dadurch erkennen, dass gilt <code class="language-javascript">s<span class="token operator">==</span><span class="token operator">!</span>s</code> tss...<br> Schön schön, aber wer braucht sowas?<br> Ich halte es für einen Bug.</p> </blockquote> <p>ich nicht, denn ich bin ziemlich sicher, du testest *nicht* im IE, sondern vermutlich im Firefox. Ich kann das von dir beschriebene Phänomen aber auch in IE5.5 und IE6.0 reproduzieren.<br> Ich kann mir nicht vorstellen, dass die Mozilla Foundation und Microsoft unabhängig voneinander denselben Bug produzieren. Es sei denn, das Verhalten ergäbe sich durch unlogische oder widersprüchliche Definitionen in der Spezifikation.</p> <blockquote> <p>Eine solche Unlogik würde man doch keiner Programmiersprache zutrauen...</p> </blockquote> <p>Nicht absichtlich. Oder wenn doch, würde man es wenigstens als ungewöhnlichen Sonderfall dokumentieren.</p> <p>Ciao,<br>  Martin</p> <div class="signature">-- <br> Finanztipp:<br> Leihen Sie sich Geld von einem Pessimisten.<br> Er rechnet sowieso nicht damit, dass er es zurückbekommt.<br> </div> JS Typprobleme Tue, 27 Oct 09 18:44:32 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403532#m1403532 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403532#m1403532 <p>Hallo,</p> <blockquote> <p>ich nicht, denn ich bin ziemlich sicher, du testest *nicht* im IE, sondern vermutlich im Firefox.</p> </blockquote> <p>Genau.</p> <blockquote> <p>Ich kann das von dir beschriebene Phänomen aber auch in IE5.5 und IE6.0 reproduzieren.</p> </blockquote> <p>Das wundert mich nicht. Es muss sich wohl irgendwie aus der ECMAScript-Spezifikation ergeben. Ein Bug in der Spezifikation vielleicht...</p> <blockquote> <blockquote> <p>Eine solche Unlogik würde man doch keiner Programmiersprache zutrauen...</p> </blockquote> <p>Nicht absichtlich. Oder wenn doch, würde man es wenigstens als ungewöhnlichen Sonderfall dokumentieren.</p> </blockquote> <p>Das haben wir ja jetzt hier nachgeholt :)</p> <p>Vielleicht ist es ja doch ganz nützlich, denn mit der Ausdruck <code class="language-javascript"><span class="token operator">!</span>s<span class="token operator">||</span><span class="token punctuation">(</span>s<span class="token operator">==</span><span class="token operator">!</span>s<span class="token punctuation">)</span></code>[TM] kann man nun von einem String s ganz einfach feststellen, ob er Text enthält oder nicht. Wenn er keinen Text enthält, ergibt das true, sonst false.</p> <p>Machen wir doch gleich Nägel mit Köpfen:</p> <p><code class="language-javascript"><span class="token class-name">String</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">hasText</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">!</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token operator">||</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">==</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span></code></p> <p>Die Unlogik fängt an mir zu gefallen...</p> <p>Gruß, Don P</p> JS Typprobleme Mon, 02 Nov 09 11:16:37 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403533#m1403533 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403533#m1403533 <p>Hallo,</p> <blockquote> <p>Machen wir doch gleich Nägel mit Köpfen:</p> <p><code class="language-javascript"><span class="token class-name">String</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">hasText</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">!</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token operator">||</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">==</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span></code></p> </blockquote> <p>Nur der Vollständigkeit halber, bevor der Thread im Archiv verschwindet:<br> Obige Methode ergibt leider auch dann <code class="language-javascript"><span class="token boolean">false</span></code>, wenn eine oder mehrere aufeinanderfolgende Nullen im String enthalten sind, was ja eigentlich kein Whitespace ist, sondern eher Text. Man müsste sie daher so notieren:</p> <pre><code class="block language-javascript"><span class="token class-name">String</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">hasText</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token operator">!</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'0'</span><span class="token punctuation">)</span><span class="token operator"><</span><span class="token number">0</span> <span class="token operator">&&</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token operator">||</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">==</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">;</span> </code></pre> <p>Das ist schon nicht mehr so elegant :(.<br> Habe aber schon den ersten Fall gehabt, wo ich die neue String-Methode brauchen konnte :)</p> <p>Gruß, Don P</p> JS Typprobleme Mon, 02 Nov 09 11:51:42 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403534#m1403534 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403534#m1403534 <p>Hallo,</p> <p>Wieso interveniert hier niemand?</p> <p>Statt</p> <blockquote> <blockquote> <p><code class="language-javascript"><span class="token operator">!</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token operator">||</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token operator">==</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></p> </blockquote> </blockquote> <p>oder</p> <blockquote> <pre><code class="block language-javascript"></code></pre> </blockquote> <p>!(this.indexOf('0')<0 && (!this||(this==!this)))</p> <blockquote></blockquote> <pre><code class="block"> kann man doch einfach `this!=0`{:.language-javascript} bzw. `!(this==0 && this.indexOf('0')<0)`{:.language-javascript} schreiben. `s==!s`{:.language-javascript} ist also wirklich unbracuhbar, ein Spezialfall, der sich wohl eher zufällig so ergeben hat bei der Spezifikation von JavaScript. Gruß, Don P </code></pre> JS Typprobleme Mon, 02 Nov 09 11:59:37 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403535#m1403535 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403535#m1403535 <blockquote> <p>Wieso interveniert hier niemand?</p> </blockquote> <p>Ich weiß nicht, wofür man sowas braucht. Wenn ich testen will ob in einer Zeichenkette Whitespacezeichen enthalten sind, nehme ich einen Regulären Ausdruck, ist für mich einfacher nachzuvollziehen.</p> <blockquote> <p>schreiben. <code class="language-javascript">s<span class="token operator">==</span><span class="token operator">!</span>s</code> ist also wirklich unbracuhbar, ein Spezialfall, der sich wohl eher zufällig so ergeben hat bei der Spezifikation von JavaScript.</p> </blockquote> <p>Soweit ich das sehe, läßt sich dank dieser Spezifikation immer schreiben:<br> if(wert) ... oder if(!wert) .....</p> <p>das ist nicht so selbstverständlich. In Perl z.b. hat man hier das Problem bei der Typenkonvertierung, dass z.b. if('0') unwahr ist.</p> <p>Struppi.</p> JS Typprobleme Mon, 02 Nov 09 12:14:53 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403536#m1403536 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403536#m1403536 <p>Hallo,</p> <blockquote> <p>Ich weiß nicht, wofür man sowas braucht. Wenn ich testen will ob in einer Zeichenkette Whitespacezeichen enthalten sind, nehme ich einen Regulären Ausdruck, ist für mich einfacher nachzuvollziehen.</p> </blockquote> <p>Es geht mehr darum festzustellen, ob Text enthalten ist, d.h. ob ein nicht leerer String überhaupt druckbare Zeichen enthält. In Performancekritischen Anwendungen sind reguläre Ausdrücke ja nicht die beste Wahl.</p> <blockquote> <p>Soweit ich das sehe, läßt sich dank dieser Spezifikation immer schreiben:<br> if(wert) ... oder if(!wert) .....</p> <p>das ist nicht so selbstverständlich. In Perl z.b. hat man hier das Problem bei der Typenkonvertierung, dass z.b. if('0') unwahr ist.</p> </blockquote> <p>Stimmt. if(wert) ist schon mächtig :)</p> <p>Gruß, Don P</p> JS Typprobleme Mon, 02 Nov 09 12:27:51 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403537#m1403537 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403537#m1403537 <blockquote> <blockquote> <p>Ich weiß nicht, wofür man sowas braucht. Wenn ich testen will ob in einer Zeichenkette Whitespacezeichen enthalten sind, nehme ich einen Regulären Ausdruck, ist für mich einfacher nachzuvollziehen.</p> </blockquote> <p>Es geht mehr darum festzustellen, ob Text enthalten ist, d.h. ob ein nicht leerer String überhaupt druckbare Zeichen enthält. In Performancekritischen Anwendungen sind reguläre Ausdrücke ja nicht die beste Wahl.</p> </blockquote> <p>Hast du das mal getestet? Dein Ausdruck ist nämlich, zumindest im Fx, langsamer (im IE ungefähr gleich, mehr Browser hatte ich noch nicht).</p> <p>Struppi.</p> JS Typprobleme Mon, 02 Nov 09 14:06:37 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403538#m1403538 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403538#m1403538 <p>Hallo,</p> <blockquote> <p>Hast du das mal getestet?</p> </blockquote> <p>Nö.</p> <blockquote> <p>Dein Ausdruck ist nämlich, zumindest im Fx, langsamer (im IE ungefähr gleich, mehr Browser hatte ich noch nicht).</p> </blockquote> <p>Welcher Audruck jetzt? Habe ja mehrere angegeben.</p> <p>Gruß, Don P</p> JS Typprobleme Mon, 02 Nov 09 14:46:24 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403539#m1403539 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403539#m1403539 <blockquote> <blockquote> <p>Hast du das mal getestet?</p> </blockquote> <p>Nö.</p> </blockquote> <p>Ich hab aber.</p> <blockquote> <blockquote> <p>Dein Ausdruck ist nämlich, zumindest im Fx, langsamer (im IE ungefähr gleich, mehr Browser hatte ich noch nicht).</p> </blockquote> <p>Welcher Audruck jetzt? Habe ja mehrere angegeben.</p> </blockquote> <p>Naja, der fehlerfreie letzte.</p> <p>Struppi.</p> JS Typprobleme Mon, 02 Nov 09 15:35:02 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403540#m1403540 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403540#m1403540 <p>Hallo,</p> <blockquote> <p>Dein Ausdruck ist nämlich, zumindest im Fx, langsamer</p> </blockquote> <p><code class="language-javascript"><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">\S</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">.</span><span class="token function">test</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span></code><br> ist also schneller? Ok, ist gekauft.</p> <p>Danke, Don P</p> JS Typprobleme Tue, 27 Oct 09 21:51:25 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403542#m1403542 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403542#m1403542 <blockquote> <blockquote> <p>Nein, bei einem Vergleich wird jeder Wert, der kein Leerstring ist, zu einem true:<br> <code class="language-javascript"><span class="token literal-property property">javascript</span><span class="token operator">:</span><span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token operator">?</span><span class="token boolean">true</span><span class="token operator">:</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code> => true</p> </blockquote> <p>Das ist aber sehr verwirrend. Wie kann dann das sein:<br> <code class="language-javascript"><span class="token function">alert</span><span class="token punctuation">(</span> <span class="token string">'\n'</span><span class="token operator">==</span><span class="token boolean">false</span> <span class="token punctuation">)</span><span class="token punctuation">;</span></code> =>true</p> </blockquote> <p>Also die <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" rel="nofollow noopener noreferrer">Spezifikation</a> sagt:</p> <p>11.9.3 The Abstract Equality Comparison Algorithm<br> The comparison x == y, where x and y are values, produces true or false. Such a comparison is<br> performed as follows:<br> 1. If Type(x) is different from Type(y), go to step 14.<br> [...]<br> 14.[...]<br> 15.[...]<br> 16.[...]<br> 17.[...]<br> 18. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.<br> 19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).</p> <p>eigentlich steht da, dass der Boolean Wert mit toNumber() umgewandelt wird, das ist entweder ein Druckfehler oder ich weiß es nicht, aber das würde die ganzen Merkwürdigkeiten erklären:</p> <p>Der String wird bei einem Vergleich zu einer Zahl umgewandelt. Während der Not-Operator die Funktion toBool() aufruft. Mit einem unterschiedlichen Ergebnis.</p> <pre><code class="block language-javascript"><span class="token function">alert</span><span class="token punctuation">(</span> <span class="token function">Number</span><span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'==false => '</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token function">Number</span><span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token boolean">false</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'\n'</span> <span class="token operator">+</span> <span class="token operator">!</span><span class="token string">'\n'</span> <span class="token operator">+</span> <span class="token string">'==true => '</span> <span class="token operator">+</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token string">'\n'</span> <span class="token operator">==</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <blockquote> <p>*kopfkratz* – Da ist doch etwas faul...</p> </blockquote> <p>Vermutlich.</p> <p>Struppi.</p> JS Typprobleme Tue, 27 Oct 09 21:59:58 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403543#m1403543 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403543#m1403543 <blockquote> <p>Also die <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" rel="nofollow noopener noreferrer">Spezifikation</a> sagt:</p> <p>11.9.3 The Abstract Equality Comparison Algorithm<br> The comparison x == y, where x and y are values, produces true or false. Such a comparison is<br> performed as follows:</p> <ol> <li>If Type(x) is different from Type(y), go to step 14.<br> [...]<br> 14.[...]<br> 15.[...]<br> 16.[...]<br> 17.[...]</li> <li>If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.</li> <li>If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).</li> </ol> <p>eigentlich steht da, dass der Boolean Wert mit toNumber() umgewandelt wird, das ist entweder ein Druckfehler oder ich weiß es nicht, aber das würde die ganzen Merkwürdigkeiten erklären:</p> </blockquote> <p><a href="http://www.united-coders.com/matthias-reuter/all-about-types-part-2" rel="nofollow noopener noreferrer">http://www.united-coders.com/matthias-reuter/all-about-types-part-2</a><br> Soweit hab ich gar nicht gwagt zu denken - der Boolean Wert wird wirklich zu einer Zahl umgewandelt.</p> <p>Struppi.</p> JS Typprobleme Wed, 28 Oct 09 00:04:19 Z https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403544#m1403544 https://forum.selfhtml.org/self/2009/oct/27/js-typprobleme/1403544#m1403544 <p>Hallo,</p> <blockquote> <p>Soweit hab ich gar nicht gwagt zu denken - der Boolean Wert wird wirklich zu einer Zahl umgewandelt.</p> </blockquote> <p>Wow. Ich wollte es jetzt doch ganz genau wissen. Es sieht so aus:</p> <p>Zunächst für <code class="language-javascript"><span class="token operator">!</span><span class="token string">'\n'</span><span class="token operator">==</span><span class="token boolean">false</span></code></p> <blockquote> <ol start="18"> <li>If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.</li> </ol> </blockquote> <p>x ist hier mit <code class="language-javascript"><span class="token operator">!</span><span class="token string">'\n'</span></code> ein boolescher Wert, der sich daraus ergibt, dass zunächst der NOT Operator <code class="language-javascript"><span class="token operator">!</span></code> auf den String <code class="language-javascript"><span class="token string">'\n'</span></code> angewendet wird.<br> Die Spezifikation sagt dazu für einen String:</p> <blockquote> <p>11.4.9 Logical NOT Operator ( ! )<br>   The production UnaryExpression : ! UnaryExpression is evaluated as follows:<br>   1. Evaluate UnaryExpression.<br>   2. Call GetValue(Result(1)).</p> </blockquote> <p>Das liefert den String.</p> <blockquote> <p>3. Call ToBoolean(Result(2)).</p> </blockquote> <p>und ToBoolean sagt:</p> <blockquote> <p>"The result is false if the argument is the empty string (its length is zero); otherwise the result is true."</p> </blockquote> <p>Also konvertiert '\n' hier zu <code class="language-javascript"><span class="token boolean">true</span></code>, wie du oben schon richtig angemerkt hast.</p> <blockquote> <p>4. If Result(3) is true, return false.</p> </blockquote> <p>Fertig: Das Ergebnis ist also <code class="language-javascript"><span class="token boolean">false</span></code> für <code class="language-javascript"><span class="token operator">!</span><span class="token string">'n'</span></code>.<br> Schließlich werden die beiden booleschen Werte verglichen:</p> <blockquote> <ol start="12"> <li>If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.</li> </ol> </blockquote> <p>Passt: <code class="language-javascript"><span class="token operator">!</span><span class="token string">'\n'</span><span class="token operator">==</span><span class="token boolean">false</span></code></p> <p>Ok, und nun der andere Fall: <code class="language-javascript"><span class="token string">'\n'</span><span class="token operator">==</span><span class="token boolean">false</span></code><br> Hier greift</p> <blockquote> <ol start="19"> <li>If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).</li> </ol> </blockquote> <p>Tatsächlich: Der Boolesche Wert konvertiert erst zu einer Zahl, d.h. zu 0 für <code class="language-javascript"><span class="token boolean">false</span></code>.<br> Dann wird der String mit dieser Zahl verglichen:</p> <blockquote> <p>17.If Type(x) is String and Type(y) is Number,</p> </blockquote> <p>return the result of the comparison ToNumber(x) == y.<br> ToNumber() wird jetzt auch auf den String angewendet, nach einer speziellen Grammatik, wobei Whitespace berücksichtigt wird (siehe 9.3.1 in der Spezifikation).<br> Für einen String, der nur Whitespace enthält, ergibt das 0.<br> Passt: <code class="language-javascript"><span class="token string">'\n'</span><span class="token operator">==</span><span class="token boolean">false</span></code></p> <p>Somit haben wir den paradoxen Fall, dass tatsächlich gilt:<br> <code class="language-javascript"><span class="token string">'\n'</span> <span class="token operator">==</span> <span class="token operator">!</span><span class="token string">'\n'</span></code> sowie auch <code class="language-javascript"><span class="token operator">!</span><span class="token string">'\n'</span> <span class="token operator">==</span> <span class="token string">'\n'</span></code></p> <p>Gruß, Don P</p>