Heute habe ich eine Bemerkung über Code erhalten, wenn man bedenkt, wie ich überprüfe, ob eine Variable in einer Schulaufgabe wahr oder falsch ist.
Der Code, den ich geschrieben hatte, war ungefähr so:
var booleanValue = true;
function someFunction(){
if(booleanValue === true){
return "something";
}
}
Sie sagten, es sei besser / ordentlicher, es so zu schreiben:
var booleanValue = true;
function someFunction(){
if(booleanValue){
return "something";
}
}
Die Bemerkung, die ich über den Teil "=== true" erhalten habe, war, dass er nicht benötigt wurde und Verwirrung stiften könnte.
Meine Idee ist jedoch, dass es besser ist zu überprüfen, ob die Variable ein Boolescher Wert ist oder nicht, zumal Javascript eine lose typisierte Sprache ist.
Im zweiten Beispiel würde eine Zeichenfolge auch "etwas" zurückgeben;
Also meine Frage; Ist es ordentlicher, den Teil "=== true" in Zukunft zu verlieren, oder empfiehlt es sich, auch den Typ der Variablen zu überprüfen.
Bearbeiten: In meinem "echten" Code gibt der Boolesche Wert an, ob ein Bild gelöscht wurde oder nicht. Die einzigen Werte, die boolValue jemals haben sollte, sind wahr oder falsch.
0 und 1 sollten beispielsweise nicht in dieser Variablen enthalten sein.
quelle
=== true
. Vermeidet Verwirrung !![0] === true
Auswertung als falsch.=== true
Sie diese Option, wenn Sie sicherstellen möchten, dass die Bedingung genau gleich isttrue
.Antworten:
Zunächst die Fakten:
if
Erfüllt die Aussage für jeden wahrheitsgemäßen Wert,booleanValue
einschließlichtrue
einer Zahl ungleich Null, eines nicht leeren Zeichenfolgenwerts, einer Objekt- oder Arrayreferenz usw.Andererseits:
Dies erfüllt die
if
Bedingung nur, wenn siebooleanValue
genau gleich isttrue
. Kein anderer wahrer Wert wird es befriedigen.Auf der anderen Seite, wenn Sie dies tun:
Anschließend gibt Javascript den Befehl coerce ein
true
, um ihn an den Typ anzupassen ,someVar
und vergleicht dann die beiden Variablen. Es gibt viele Situationen, in denen dies wahrscheinlich nicht das ist, was man beabsichtigen würde. Aus diesem Grund möchten Sie in den meisten Fällen vermeiden,==
dass es ziemlich viele Regeln gibt, wie Javascript zwei Dinge zum gleichen Typ zwingt, und es sei denn, Sie verstehen alle diese Regeln und können alles vorhersehen, was der JS-Interpreter wann tun könnte Angesichts von zwei verschiedenen Typen (die die meisten JS-Entwickler nicht können) möchten Sie wahrscheinlich==
ganz vermeiden .Als Beispiel dafür, wie verwirrend es sein kann:
Für den Wert
2
würde man denken, dass dies2
ein wahrer Wert ist, also würde er sich positiv mit dem vergleichentrue
, aber so funktioniert der Typenzwang nicht. Es konvertiert den Wert für die rechte Hand so, dass er mit dem Typ des Werts für die linke Hand übereinstimmt, sodass ertrue
in die Zahl konvertiert wird ,1
damit verglichen wird,2 == 1
was sicherlich nicht das ist, was Sie wahrscheinlich beabsichtigt haben.Also, Käufer aufgepasst. Es ist wahrscheinlich am besten,
==
in fast allen Fällen zu vermeiden, es sei denn, Sie kennen explizit die Typen, die Sie vergleichen werden, und wissen, wie alle möglichen Typen von Zwangsalgorithmen funktionieren.Es hängt also wirklich von den erwarteten Werten ab
booleanValue
und davon, wie der Code funktionieren soll. Wenn Sie im Voraus wissen, dass es immer nur einentrue
oderfalse
Wert haben wird, vergleichen Sie ihn explizit mitist nur extra code und unnötig und
ist kompakter und wohl sauberer / besser.
Wenn Sie andererseits nicht wissen, was sein
booleanValue
könnte, und Sie testen möchten, ob es wirklich so eingestellt ist, dasstrue
keine anderen automatischen Typkonvertierungen zulässig sind, dannist nicht nur eine gute Idee, sondern erforderlich.
Wenn Sie sich beispielsweise die Implementierung von
.on()
in jQuery ansehen , hat sie einen optionalen Rückgabewert. Wenn der Rückruf zurückkehrtfalse
, stoppt jQuery automatisch die Weitergabe des Ereignisses. In diesem speziellen Fallfalse
überprüfen sie , da jQuery die Weitergabe NUR stoppen möchte, wenn sie zurückgegeben wurde, die Rückgabe des Rückgabewerts,=== false
weil sie nicht möchtenundefined
oder0
oder""
oder irgendetwas anderes, das automatisch in false konvertiert, um auch den Vergleich zu erfüllen.Hier ist beispielsweise der Rückrufcode für das jQuery-Ereignis:
Sie können sehen, dass jQuery explizit sucht
ret === false
.Es gibt aber auch viele andere Stellen im jQuery-Code, an denen eine einfachere Überprüfung angebracht ist, wenn der Code dies wünscht. Beispielsweise:
quelle
Wenn Sie schreiben :
if(x === true)
, gilt dies nur für x = trueWenn Sie schreiben
if(x)
:, gilt dies für jedes x , das nicht: '' (leere Zeichenfolge), false, null, undefined, 0, NaN ist.quelle
NaN
und-0
.Im einfachen "if" wird die Variable zu einem Booleschen Wert gezwungen und verwendet toBoolean für das Objekt: -
Der Vergleich mit === hat jedoch keinen Zwang, daher müssen sie ohne Zwang gleich sein.
Wenn Sie sagen, dass das Objekt möglicherweise nicht einmal ein Boolescher Wert ist, müssen Sie möglicherweise mehr als nur wahr / falsch berücksichtigen.
quelle
Es hängt von Ihrem Anwendungsfall ab. Es mag sinnvoll sein, den Typ ebenfalls zu überprüfen, aber wenn es nur ein Flag ist, ist dies nicht der Fall.
quelle
===
Vergleich führt keinen Typzwang durch. Der OP-Code testet also effektiv den Typ des Flags. Dies ist nur erfolgreich, wenn der Wert ein Boolescher Wert ist und true ist.Im Allgemeinen ist es sauberer und einfacher, das wegzulassen
=== true
.In Javascript sind diese Aussagen jedoch unterschiedlich.
if (booleanValue)
ausgeführt wird , wennbooleanValue
ist truthy - etwas anderes als0
,false
,''
,NaN
,null
, undundefined
.if (booleanValue === true)
wird nur ausgeführt, wennbooleanValue
genau gleich isttrue
.quelle
''
.Der Identitätsoperator
(===)
verhält sich identisch zur Gleichheit(==)
, außer dass keine Typkonvertierung durchgeführt wird und die Typen identisch sein müssen, um als gleich zu gelten.quelle
if (booleanValue)
undif (booleanValue==true)
wannbooleanValue
ist2
. Diese beiden Aussagen führen nicht zum gleichen Ergebnis.Da der überprüfte Wert
Boolean
bevorzugt wird, wird er direkt für weniger Codierung verwendet, und es wurde überhaupt dasselbe getan==true
quelle
Da Sie bereits eindeutig als Bool initialisiert haben, ist der
===
Operator meines Erachtens nicht erforderlich.quelle
Wenn die Variable immer nur boolesche Werte annehmen kann, ist es sinnvoll, die kürzere Syntax zu verwenden.
Wenn es möglicherweise anderen Typen zugewiesen werden kann und Sie
true
von1
oder unterscheiden"foo"
müssen, müssen Sie verwenden=== true
.quelle
Ich denke, dass Ihre Argumentation stichhaltig ist. In der Praxis habe ich jedoch festgestellt, dass es weitaus üblicher ist, den
===
Vergleich wegzulassen . Ich denke, dass es dafür drei Gründe gibt:undefined
oder einennull
Wert erhalten. Oft möchten Sie nur, dass Ihr Test in solchen Fällen fehlschlägt. (Obwohl ich versuche, diese Ansicht mit dem Motto "schnell scheitern" in Einklang zu bringen).Betrachten Sie dieses Beispiel:
Ich denke, dass diese Art von Code nicht ungewöhnlich ist. Es behandelt Fälle, in denen
getInput()
Retourenundefined
,null
, oder eine leere Zeichenfolge. Aufgrund der beiden booleschen AuswertungensubmitInput()
wird nur aufgerufen, wenn die angegebene Eingabe eine Zeichenfolge ist, die Nicht-Leerzeichen enthält.In JavaScript wird
&&
das erste Argument zurückgegeben, wenn es falsch ist, oder das zweite Argument, wenn das erste Argument wahr ist. sonormalized
wird es seinundefined
wennsomeString
es undefiniert war und so weiter. Das bedeutet, dass keine der Eingaben in die obigen booleschen Ausdrücke tatsächlich boolesche Werte sind.Ich weiß, dass viele Programmierer, die an eine starke Typprüfung gewöhnt sind, zusammenzucken, wenn sie Code wie diesen sehen. Beachten Sie jedoch, dass beim Anwenden einer starken Typisierung wahrscheinlich explizite Überprüfungen
null
oderundefined
Werte erforderlich sind, wodurch der Code unübersichtlich wird. In JavaScript wird das nicht benötigt.quelle
Das hängt davon ab. Wenn Sie befürchten, dass Ihre Variable als TRUE aufgelöst werden könnte. Dann ist eine harte Prüfung ein Muss. Ansonsten liegt es an Ihnen. Ich bezweifle jedoch, dass die Syntax
whatever == TRUE
jemals jemanden verwirren würde, der wusste, was er tat.quelle
In Javascript ist die Idee des Booleschen Wertes ziemlich vieldeutig. Bedenken Sie:
Wenn Sie also eine if-Anweisung (oder eine andere Steueranweisung) verwenden, muss keine var-Typ vom Typ "Boolean" verwendet werden. Daher ist meiner Meinung nach der Teil "=== true" Ihrer Aussage nicht erforderlich, wenn Sie wissen, dass es sich um einen Booleschen Wert handelt, aber absolut notwendig, wenn Ihr Wert eine mehrdeutige "wahrheitsgemäße" Variable ist. Mehr zu Booleschen Werten in Javscript finden Sie hier .
quelle
Revisa https://www.w3schools.com/js/js_comparisons.asp
Beispiel:
=== bedeutet gleicher Typ auch gleicher Wert == genau gleicher Wert
quelle
Kann auch mit einem Booleschen Objekt getestet werden, wenn Sie ein Objekt testen müssen
error={Boolean(errors.email)}
quelle