2010-09-24 4 views
7
jQuery.each(player, function(key, val){      
    if (el = $("#pr_attr_plain_"+key)){ 
      el.text(val === "" ? 0 : " " + val); 
    } 
}); 

Ich erbte ein Projekt und ich stieß auf etwas Seltsames. Der Typ, der das Projekt begonnen hat, ist ein erfahrener Programmierer, definitiv mehr als ich. Gibt es einen Wert oder Grund (egal wie schlecht) in dies zu tun:ein einzelnes gleich in einem if. Javascript. Irgendein guter Grund?

if (el = $("#pr_attr_plain_"+key)) 

Es funktioniert jetzt, und es ist in einem Teil des Codes, die ich nicht zu berühren. Ich will es nicht ändern und unerwartete Konsequenzen haben, ohne zu wissen, was es tun könnte.

Antwort

12

Es kann richtig sein. Der Code entspricht:

jQuery.each(player, function(key, val){      
    el = $("#pr_attr_plain_"+key); 
    if (el){ 
      el.text(val === "" ? 0 : " " + val); 
    } 
}); 
+8

Ich werde dies als Kommentar hinzufügen, da niemand es erwähnt hat. '$ (..)' wird IMMER ein jQuery-Objekt zurückgeben, auch wenn es keinen Elementen entspricht. Das ursprüngliche Code-Snippet tut nicht das, was der Autor dachte. Der Körper der Bedingung wird immer ausgeführt, wird aber sowieso ein No-Op sein, wenn 'el' leer ist, also ist es in Ordnung. Es hätte nur '$ (" # pr .. ") sein sollen. Text (...);' –

+0

Eigentlich habe ich es erwähnt :) Da ist 'jQuery.each' und nicht' $ .each' im Snippet Vielleicht läuft jQuery im Kein-Konflikt-Modus? – Tgr

0

Uh, vielleicht Testen der $ Operator? Ich würde Gefahr eine Vermutung, dass es falsch zurückgibt, wenn es einen Fehler in der Zuordnung gibt.

3

Wenn die el = $("#pr_attr_plain_"+key) ausgewertet 0 oder false oder null oder undefined, wird es nicht in dem if-Block gehen. In allen anderen Fällen wird es.

0

Momentan setzt diese el-$("#pr_attr_plain_"+key). Dies testet die Zuordnung. Dies würde True zurückgeben, es sei denn, $() schlägt fehl und gibt null, false oder 0 zurück.

3

Es ist nur eine hässliche Art und Weise

el = $("#pr_attr_plain_"+key); 
if (el){ 
     el.text(val === "" ? 0 : " " + val); 
} 

des Schreibens, das wiederum ist die gleiche wie

if ($("#pr_attr_plain_"+key)){ 
     $("#pr_attr_plain_"+key).text(val === "" ? 0 : " " + val); 
} 

aber etwas schneller (ein kleiner Aufruf an die $-Funktion) und wohl leichter zu lesen. Auf der anderen Seite gibt es mehrere Probleme mit sich:

  • $(something) wird nie falsch bewerten (es gibt ein jQuery-Objekt, das truthy ist). Wer das geschrieben hat, meinte wahrscheinlich .
  • gibt es keine Notwendigkeit für das ganze if. Sie können einfach $("#pr_attr_plain_"+key).text(val === "" ? 0 : " " + val); schreiben und es wird keine Wirkung haben, wenn der jQuery-Selektor keinem Element entspricht.
  • Wenn nicht zuvor el verwendet wurde, sollten Sie var el =... schreiben, nicht el =, sonst wird el global sein.
  • , da es ein häufiger Fehler ist, versehentlich = schreiben statt ==, ist es ratsam, Zuweisungen innerhalb Bedingungen entweder zu vermeiden oder eine zusätzliche Klammer verwenden, um deutlich zu machen, das Sie es bewusst tun:

.

if ((el = $("#pr_attr_plain_"+key))){ 
     el.text(val === "" ? 0 : " " + val); 
} 
+0

Oder vielleicht mischen Sie Frameworks und '$' ist Prototype oder so? – Tgr

0

Zuordnung in einer if Aussage ist nicht so häufig, aber es tut Ernte ein in einigen Sprachen, die ihn unterstützen, und wird häufig verwendet, um Code übersichtlicher zu machen.

Normalerweise ist es für Situationen reserviert, in denen Sie einer Interim-Variablen einen Wert zuweisen wollen, um sie auf Wahrheit zu testen und dann etwas anderes damit zu tun. So zum Beispiel:

if (foo = performExpensiveOperation()){ 
    doSomethingElse(foo); // this only happens if 'foo' is true 
} 

..ist ein klein wenig kürzer als die Alternative:

foo = performExpensiveOperation(); 
if (foo) { 
    doSomethingElse(foo); 
} 

Leider ist Javascript nicht das var Schlüsselwort in einer if Aussage erlauben (das heißt, if (var foo = bar) ein Syntaxfehler), was bedeutet, dass Sie sowieso eine Variable im Voraus deklarieren müssen (oder, schlimmer noch, eine globale Variable verwenden).

Ich sehe es in Perl auch ein bisschen, da es auch die Variable auf den lexikalischen Bereich if beschränkt. Das wiederum ist etwas, das Javascript nicht tun kann (nun, Unterstützung für let ist da).

1

Wie auf JSLint hingewiesen, ist es eine schlechte Übung, da es auch ein häufiger Fehler sein kann. Besser es zu beheben und die Wahrscheinlichkeit einer falschen Interpretation zu reduzieren.

+0

jslint ist, wie ich es gefunden habe! – JoeM05

Verwandte Themen