welcher gleichheitsoperator (== vs ) sollte in javascript-vergleichen verwendet werden?
<p>ich benutze <a href="http://en.wikipedia.org/wiki/jslint">jslint</a> , um javascript zu durchlaufen, und es gibt viele vorschläge, um <code>==</code> (zwei gleichheitszeichen) durch <code></code> (drei gleichheitszeichen) zu ersetzen, wenn ich dinge wie vergleichen tue <code>idsele\_unvehtype.value.length == 0</code> innerhalb einer <code>if</code> anweisung.</p><p>hat das ersetzen von <code>==</code> durch <code></code> einen leistungsvorteil?</p><p>jede leistungsverbesserung wäre zu begrüßen, da viele vergleichsoperatoren existieren.</p><p>wenn keine typkonvertierung stattfindet, würde es einen leistungsgewinn gegenüber <code>==</code> geben?</p>
<p>der identitätsoperator (<code></code>) verhält sich identisch mit dem gleichheitsoperator (<code>==</code>), mit der ausnahme, dass keine typkonvertierung durchgeführt wird und die typen identisch sein müssen, damit sie als gleich gelten.</p><p>referenz: <a href="http://www.c-point.com/javascript\_tutorial/jsgrpcomparison.htm">javascript tutorial: vergleichsoperatoren</a> </p><p>der operator <code>==</code> vergleicht die werte <em>, nachdem alle erforderlichen typkonvertierungen </em> durchgeführt wurden. der operator <code></code> führt die konvertierung <strong> nicht durch </strong>. wenn also zwei werte nicht vom selben typ sind, gibt <code></code> einfach <code>false</code>. beide sind gleich schnell.</p><p>um douglas crockfords vorzügliches zu zitieren <a href="https://rads.stackoverflow.com/amzn/click/com/0596517742">javascript: the good parts</a> ,</p><blockquote> <p>javascript hat zwei gruppen von gleichheitsoperatoren: <code></code> und <code>!==</code> und ihre bösen zwillinge <code>==</code> und <code>!=</code>. die guten arbeiten so, wie sie es erwarten würden. wenn die beiden operanden vom selben typ sind und denselben wert haben, dann erzeugt <code></code> <code>true</code> und <code>!==</code> <code>false</code>. die bösen zwillinge tun das richtige, wenn die operanden vom selben typ sind, aber wenn sie von unterschiedlichem typ sind, versuchen sie, die werte zu erzwingen. die regeln, nach denen sie das tun, sind kompliziert und nicht zu merken. dies sind einige der interessanten fälle:</p> <pre><code>'' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 // true </code></pre> <p>der mangel an transitivität ist alarmierend. mein rat ist, niemals die bösen zwillinge zu benutzen. verwenden sie stattdessen immer <code></code> und <code>!==</code>. alle soeben gezeigten vergleiche führen zu <code>false</code> mit dem operator <code></code>.</p> </blockquote><hr><h3>aktualisieren:</h3><p>ein guter punkt wurde von <a href="https://stackoverflow.com/users/165495/casebash">@ casebash</a> in den kommentaren und in <a href="https://stackoverflow.com/users/113570/philippe-leybaert">@ phillipe laybaerts</a> <a href="https://stackoverflow.com/a/957602/1288">antwort</a> in bezug auf referenztypen angesprochen. bei referenztypen handeln <code>==</code> und <code></code> konsistent miteinander (außer in besonderen fällen).</p><pre><code>var a = [1,2,3]; var b = [1,2,3]; var c = { x: 1, y: 2 }; var d = { x: 1, y: 2 }; var e = "text"; var f = "te" + "xt"; a == b // false a  b // false c == d // false c  d // false e == f // true e  f // true </code></pre><p>der sonderfall ist, wenn sie ein literal mit einem objekt vergleichen, das aufgrund seiner <code>tostring</code> - oder <code>valueof</code> -methode dasselbe literal ergibt. angenommen, sie vergleichen ein zeichenfolgenliteral mit einem zeichenfolgenobjekt, das vom konstruktor <code>string</code> erstellt wurde.</p><pre><code>"abc" == new string("abc") // true "abc"  new string("abc") // false </code></pre><p>hier überprüft der operator <code>==</code> die werte der beiden objekte und gibt <code>true</code> zurück, aber der operator <code></code> stellt fest, dass sie nicht vom selben typ sind und <code>false</code> zurückgeben. welches ist richtig? das hängt wirklich davon ab, was sie vergleichen wollen. mein rat ist, die frage vollständig zu umgehen und den konstruktor <code>string</code> nicht zum erstellen von zeichenfolgenobjekten zu verwenden.</p><p><strong> referenz </strong><br> <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3">http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.</a> </p>
<h2>moderne html5-techniken zum ändern von klassen</h2><p>moderne browser haben <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist"><strong>classlist</strong></a> hinzugefügt, das methoden zur verfügung stellt, mit denen klassen leichter ohne bibliotheken bearbeitet werden können:</p><pre><code>document.getelementbyid("myelement").classlist.add('myclass'); document.getelementbyid("myelement").classlist.remove('myclass'); if ( document.getelementbyid("myelement").classlist.contains('myclass') ) document.getelementbyid("myelement").classlist.toggle('myclass'); </code></pre><p>leider funktionieren diese in internet explorer vor version 10 nicht, obwohl es ein <a href="http://en.wikipedia.org/wiki/shim\_(computing)">shim</a> gibt, um die unterstützung für ie8 und ie9 hinzuzufügen, die unter <a href="https://developer.mozilla.org/en-us/docs/dom/element.classlist">diese seite</a> verfügbar ist. es wird jedoch immer mehr <a href="http://caniuse.com/#feat=classlist">unterstützt</a> .</p><h2>einfache browserübergreifende lösung</h2><p>die standard-javascript-methode zur auswahl eines elements ist <a href="https://developer.mozilla.org/en-us/docs/dom/document.getelementbyid"><code>document.getelementbyid("id")</code></a> . dies wird in den folgenden beispielen verwendet. sie können elemente natürlich auch auf andere weise erhalten. in der richtigen situation können sie stattdessen einfach <code>this</code> verwenden ins detail geht dies nicht in den rahmen der antwort.</p><h3>so ändern sie alle klassen für ein element:</h3><p>um alle vorhandenen klassen durch eine oder mehrere neue klassen zu ersetzen, legen sie das classname-attribut fest:</p><pre><code>document.getelementbyid("myelement").classname = "myclass"; </code></pre><p>(sie können eine durch leerzeichen getrennte liste verwenden, um mehrere klassen anzuwenden.)</p><h3>so fügen sie einem element eine zusätzliche klasse hinzu:</h3><p>um einem element eine klasse hinzuzufügen, ohne vorhandene werte zu entfernen/zu beeinflussen, fügen sie ein leerzeichen und den neuen klassennamen wie folgt hinzu:</p><pre><code>document.getelementbyid("myelement").classname += " myclass"; </code></pre><h3>so entfernen sie eine klasse aus einem element:</h3><p>um eine einzelne klasse zu einem element zu entfernen, ohne andere potenzielle klassen zu beeinflussen, ist ein einfacher regex-ersetzen erforderlich:</p><pre><code>document.getelementbyid("myelement").classname = document.getelementbyid("myelement").classname.replace ( /(?:^|\s)myclass(?!\s)/g , '' ) /* code wrapped for readability - above is all one statement */ </code></pre><p>eine erklärung dieser regex lautet wie folgt:</p><pre><code>(?:^|\s) # match the start of the string, or any single whitespace character myclass # the literal text for the classname to remove (?!\s) # negative lookahead to verify the above is the whole classname # ensures there is no non-space character following # (i.e. must be end of string or a space) </code></pre><p>das flag <code>g</code> weist das ersetzen an, nach bedarf zu wiederholen, falls der klassenname mehrmals hinzugefügt wurde.</p><h3>so prüfen sie, ob eine klasse bereits auf ein element angewendet wurde:</h3><p>der gleiche reguläre ausdruck, der oben zum entfernen einer klasse verwendet wurde, kann auch zur überprüfung verwendet werden, ob eine bestimmte klasse vorhanden ist:</p><pre><code>if ( document.getelementbyid("myelement").classname.match(/(?:^|\s)myclass(?!\s)/) ) </code></pre><p><br/></p><h3>zuweisen dieser aktionen zu onclick-ereignissen:</h3><p>es ist zwar möglich, javascript direkt in die html-ereignisattribute (z. b. <code>onclick="this.classname+=' myclass'"</code>) zu schreiben, dies wird jedoch nicht empfohlen. insbesondere bei größeren anwendungen wird durch die trennung von html-markup von javascript-interaktionslogik ein wartungsfähigerer code erzielt.</p><p>der erste schritt dazu ist das erstellen einer funktion und das aufrufen der funktion im onclick-attribut. beispiel:</p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } &lt;/script&gt; ... &lt;button onclick="changeclass()"&gt;my button&lt;/button&gt; </code></pre><p><sub><em>(es ist nicht erforderlich, dass dieser code in skript-tags enthalten ist. dies ist lediglich der kürze halber als beispiel gedacht. das einschließen von javascript in eine andere datei ist möglicherweise geeigneter.)</em></sub></p><p>der zweite schritt besteht darin, das onclick-ereignis aus dem html-code in javascript zu verschieben, beispielsweise mit <a href="https://developer.mozilla.org/en-us/docs/dom/element.addeventlistener">addeventlistener</a> </p><pre><code>&lt;script type="text/javascript"&gt; function changeclass(){ // code examples from above } window.onload = function(){ document.getelementbyid("myelement").addeventlistener( 'click', changeclass); } &lt;/script&gt; ... &lt;button id="myelement"&gt;my button&lt;/button&gt; </code></pre><p>(beachten sie, dass der window.onload-teil erforderlich ist, damit der inhalt dieser funktion <em>ausgeführt wird, nachdem der html-code</em> vollständig geladen wurde. andernfalls ist das myelement möglicherweise nicht vorhanden, wenn der javascript-code aufgerufen wird, sodass die zeile fehlschlägt .)</p><p><br/></p><h2>javascript frameworks und bibliotheken</h2><p>der obige code ist alles in standard-javascript enthalten. es ist jedoch üblich, entweder ein framework oder eine bibliothek zu verwenden, um allgemeine aufgaben zu vereinfachen und von behobenen fehlern und edge-fällen zu profitieren, an die sie beim schreiben des codes nicht denken.</p><p>während einige leute es für übertrieben halten, ein ~ 50 kb-framework für das einfache ändern einer klasse hinzuzufügen, ist die überlegung, wenn sie umfangreiche javascript-arbeiten ausführen oder etwas, das ungewöhnliches cross-browser-verhalten hat, eine überlegung wert.</p><p><em>(in groben zügen handelt es sich bei einer bibliothek um eine reihe von werkzeugen, die für eine bestimmte aufgabe entwickelt wurden, während ein framework im allgemeinen mehrere bibliotheken enthält und eine reihe von aufgaben ausführt.)</em></p><p>die obigen beispiele wurden im folgenden mit <a href="http://jquery.com">jquery</a> wiedergegeben, wahrscheinlich der am häufigsten verwendeten javascript-bibliothek (obwohl es auch andere gibt, die es zu untersuchen gilt).</p><p>(beachten sie, dass <code>$</code> hier das jquery-objekt ist.)</p><h3>klassen mit jquery ändern:</h3><pre><code>$('#myelement').addclass('myclass'); $('#myelement').removeclass('myclass'); if ( $('#myelement').hasclass('myclass') ) </code></pre><p>darüber hinaus bietet jquery eine verknüpfung zum hinzufügen einer klasse, wenn sie nicht angewendet wird, oder zum entfernen einer klasse, die folgendes ausführt:</p><pre><code>$('#myelement').toggleclass('myclass'); </code></pre><p><br/></p><h3>zuweisen einer funktion zu einem klickereignis mit jquery:</h3><pre><code>$('#myelement').click(changeclass); </code></pre><p>oder, ohne eine id zu benötigen:</p><pre><code>$(':button:contains(my button)').click(changeclass); </code></pre><p><br/></p> Am besten einen Vergleich machen. <p>erwägen sie die verwendung eines <strong> mehrfachauswahl-designs mit token </strong>. die filter-as-you-type-funktion ist nett, aber nicht unbedingt erforderlich. diese funktionieren gut, wenn im allgemeinen anwendungsfall entweder einer oder nur wenige ausgewählt werden. die benutzerfreundlichkeit nimmt jedoch schnell ab, wenn sie viele auswählen müssen, da der benutzer das menü für jedes element erneut aufrufen muss.</p><p><img src="https://i.stack.imgur.com/fth7o.png" alt="multi-select with tokens, via harvesthq.github.com/chosen"></p><ul> <li> <a href="http://harvesthq.github.com/chosen/">http://harvesthq.github.com/chosen/</a> </li> <li> <a href="http://designingwebinterfaces.com/the-multi-select-solution">http://designingwebinterfaces.com/the-multi-select-solution</a> </li> <li> <a href="http://loopj.com/jquery-tokeninput/">http://loopj.com/jquery-tokeninput/</a> </li> </ul><p>sie haben die tokenisierte mehrfacheingabemethode bereits in ihren e-mail-clients gesehen. <img src="https://i.stack.imgur.com/h1aid.png" alt="multi-select-tokens in email"></p><p>wenn häufig mehrere ausgewählt werden, können sie ein kontrollkästchenmenü <strong> </strong> in betracht ziehen. der unterschied besteht darin, dass das dropdown-menü über alle klicks hinweg dauerhaft bleibt (und die mehrfachauswahl visuell kommuniziert). daher kann der benutzer mit klick-klick-klick schnell mehrere elemente auswählen. für unsere web-app möchten wir dieses design durch hinzufügen der token-funktionalität verbessern.</p><p><img src="https://i.stack.imgur.com/zqizh.png" alt="checkbox menu, via realestate.com.au"></p><ul> <li> <a href="http://www.realestate.com.au/">http://www.realestate.com.au/</a> </li> <li> <a href="http://blogfreakz.com/jquery/jquery-dropdown-check-list/">http://blogfreakz.com/jquery/jquery-dropdown-check-list/</a> </li> </ul> <p><code>i</code> und <code>j</code> werden in der regel seit geraumer zeit als indizes in einigen mathematischen bereichen verwendet (z. b. sehen sie selbst in artikeln, die älter sind als höhere sprachen, häufig dinge wie "x.<sub>ich, j</sub>", besonders in sachen wie einer summe).</p><p>als sie fortran entwarfen, beschlossen sie (anscheinend), dasselbe zuzulassen, sodass alle variablen, die mit "i" bis "n" beginnen, standardmäßig auf ganzzahl und alle anderen auf real (gleitkomma) eingestellt sind. für diejenigen, die es verpasst haben, ist dies die quelle des alten witzes "gott ist real (sofern nicht als ganzzahl deklariert)".</p><p>die meisten menschen scheinen wenig grund gesehen zu haben, dies zu ändern. es ist weithin bekannt und verstanden und ziemlich prägnant. hin und wieder sieht man etwas, das von einem psychotiker geschrieben wurde, der glaubt, dass etwas wie ein echter vorteil ist:</p><pre class="lang-c prettyprint-override"><code>for (int outer\_index\_variable=0; outer\_index\_variable &lt; 10; outer\_index\_variable++) for (int inner\_index\_variable=0; inner\_index\_variable &lt; 10; inner\_index\_variable++) x[outer\_index\_variable][inner\_index\_variable] = 0; </code></pre><p>zum glück ist dies jedoch ziemlich selten, und die meisten styleguides weisen jetzt darauf hin, dass lange, beschreibende variablennamen <em>können</em> nützlich sein, sie <em>nicht</em> sie immer benötigen, insbesondere für etwas dies ist der fall, wenn der gültigkeitsbereich der variablen nur ein oder zwei codezeilen umfasst.</p> Es lohnt sich, einen Blick auf diesen [`Blog Post`](http://lostechies.com/jimmybogard/2012/07/20/choosing-an-orm-strategy/) werfen, aber letztendlich werden die Kriterien von Ihnen festgelegt. Sie müssen entscheiden, ob 

* schnelle Entwicklung
* Performance
* Code-zuerst
* DB zuerst

 oder was auch immer Sie suchen und priorisieren Sie die Liste basierend auf, was noch wichtiger ist. Dann verwenden Sie diese Liste, um Ihre Forschung zusammenzustellen. Hallo
 
*>>Sollen diese Seiten nicht mehr als canonical gekennzeichnet werden?*
Wenn sie unterschiedlich sind, dann darf Canonical nicht verwendet werden.
 
*>>Werden immer beide Seiten indiziert und im jeweiligen Land die entsprechende in der Suchmaschine gefunden?*
Nein, dafür ist Hreflang notwendig, Tutorial siehe hier: <https://support.google.com/webmasters/answer/189077?hl=de>
 
*>>Welche Vor- und Nachteile können wann auftreten?*
Vorteile liegen darin das alles Richtlinienkonform umgesetzt wird. Nachteile entstehen bei falscher Umsetzung, denn dann wird sich Google sehr wahrscheinlich nicht 100%  an die Ländervarianten halten.
 
lg
PeVy <p>hier ist ein anfang ... :)</p><ul> <li> <a href="http://www.totalvalidator.com/validator/validatorform">wcag-validator</a> </li> <li> <a href="http://wave.webaim.org/">wave - tool zur bewertung der barrierefreiheit im internet</a> </li> <li> <a href="http://www.w3.org/wai/er/tools/complete">vollständige liste der tools zur bewertung der barrierefreiheit im internet</a> - eine ziemlich lange liste, aber sie können diese lange liste durchsuchen</li> </ul> Ein reg-ex wird viel schneller sein als html agility pack. 

 Aber Sie sollten bedenken, dass HTML nicht immer gut geformt sein muss. Die Suche nach den richtigen Daten, die Sie nur mit reg-ex verwenden möchten, kann fehlschlagen. Browser sind sehr fehlerverzeihend. 

 Agility Pack ist ein großartiges Werkzeug. Es bietet eine Menge Funktionen für den Speicher, den es verbraucht. <p>c hat den vorteil, dass es eine relativ <strong> <em> kleine sprache</em> </strong> ist, was es <strong> macht ) <em> einfach einen c-compiler zu implementieren</em> </strong> (während ein c++ - compiler ein monster zum schreiben ist), und macht es <strong> = <em> leichter die sprache zu lernen</em> </strong>. siehe auch <a href="https://www.tiobe.com/tiobe-index/">tiobe-index</a> , wonach c etwas vor c++ liegt.</p><p>in (imo) abnehmender reihenfolge der rechtfertigung wird c immer noch häufig verwendet</p><ul> <li> <p>eingebettetes zeug<br> es ist viel einfacher, einen c-compiler auf eine kleine plattform zu portieren, als einen c++ - compiler zu portieren. außerdem behaupten c-befürworter, dass c++ "hinter ihrem rücken zu viel tut". allerdings imo das ist fud.</p> </li> <li> <p>systemprogrammierung<br> auch dies ist normalerweise auf die behauptung zurückzuführen, dass es einfacher ist, "zu wissen, was der compiler tut". viele eingebettete programme würden jedoch beispielsweise von vorlagen und anderen c++ - schlüsselfunktionen profitieren.</p> </li> <li> <p>quelloffene software<br> das ist jedoch meistens ein einstellungsproblem: oss hat c immer c++ vorgezogen (während es in großen teilen der branche das gegenteil ist). torvalds irrationaler hass könnte tatsächlich der wichtigste grund dafür sein <em> unter linux</em>.</p> </li> </ul> <p>ich verwende <a href="http://noscript.net/features">noscript</a> , aber liste jede site auf, die ich tatsächlich verwenden möchte.</p><blockquote> <p>wenn sie noscript installieren, werden javascript, java, flash silverlight und möglicherweise andere ausführbare inhalte standardmäßig <em> blockiert </em>. sie können <em> die ausführung von </em> javascript/java/... selektiv auf den websites zulassen, denen sie vertrauen. sie können einer site erlauben, skripte vorübergehend auszuführen, wenn sie nur zufällig oder dauerhaft surfen, wenn sie sie häufig besuchen und ihr wirklich vertrauen. dies bedeutet, dass noscript aus ihren eigenen browsergewohnheiten lernt und nach einer weile im hintergrund verschwindet. wenn sie jedoch auf eine schädliche webseite stoßen, wird es sofort wieder angezeigt, um ihren tag zu retten.</p> <p>wenn sie eine site mit blockierten skripten durchsuchen, wird eine benachrichtigung angezeigt, die der vom popupblocker ausgegebenen ähnelt.<br> sehen sie sich das symbol oder das statusleistensymbol an, um die aktuellen noscript-berechtigungen zu erfahren ...</p> <p><img src="https://i.stack.imgur.com/zfxkv.png" alt="http://noscript.net/noscript/ss0.png" title="noscript tooltip screen shot"></p> </blockquote>