2010-06-03 2 views
13

habe ich diesen Bau, um die Browser-Darstellungsbreite zu erhalten:Warum gibt Javascript ODER einen anderen Wert als wahr/falsch zurück?

function() { return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; } 

ich die Browser-Marotten verstehen beteiligt. Was ich nicht verstehe ist, warum || den Wert zurückgibt. Also habe ich dieses alert(undefined || 0 || 3); versucht und sicher genug, er warnt 3. Ich finde das bizarr, denn ich erwarte true oder false. Könnte jemand erklären, was vor sich geht?

+0

Hat 'alert (undefined && 0 && 3)' return '0'? –

+2

@Rising Star: warum fragen Sie das OP, wenn Sie es einfach selbst tun können? ... Auch für mich gibt es 'undefined'. – Matchu

+3

FYI: Wenn Sie einen truthigen Wert haben möchten, tun Sie '!! (undefiniert || 0 || 3)' – Matt

Antwort

13

Werfen Sie einen Blick auf den ECMAScript-Standards Abschnitt 11.11 Binary Logical Operators

Die Produktion LogicalORExpression: LogicalORExpression || LogicalANDExpression wird als folgt ausgewertet:

1. LogicalORExpression auswerten.

2. Rufen Sie GetValue (Ergebnis (1)).

3.Call ToBoolean (Ergebnis (2)).

4. Wenn Ergebnis (3) wahr ist, Ergebnis (2) zurücksenden.

5. LogicalANDExpression auswerten.

6. Call GetValue (Ergebnis (5)).

7.Rückkehrergebnis (6).

So wertet es die boolean Umwandlung jeden Operanden, sondern liefert den aktuellen Wert des Operanden.

Wenn Sie wissen wollen, wie Javascript Werte in einen boolean konvertiert, siehe Abschnitt 9.2 ToBoolean

17

Der JavaScript-Operator || definiert den linken Wert zurück, wenn es zu einem truthy Wert auswertet, da sonst der richtige Wert statt true der Rückkehr selbst. So ist es in der Spezifikation definiert.

Ich weiß, es kann manchmal ärgerlich sein, Sie könnten versehentlich am Ende einen Verweis auf etwas halten, das Sie nicht festhalten wollen, aber es ermöglicht auch den handlichen Trick, den Ihr Beispiel hat. Alles hat seine Vor- und Nachteile.

4

Die ODER-Funktion ist eine Kurzschluss-ODER-Auswertung - sie gibt das erste Element zurück, das nicht falsch ist, oder andernfalls das letzte falsche Element.

Dies ist eigentlich sehr nützlich, so dass man Ausdrücke wie

a = a || someValue; 

die die gleichen wie

if (a==null) 
    a = someValue; 
+1

Es ist nicht nur "nicht null". Die leere Zeichenfolge und die numerische Null werden beide als "falsch" behandelt. Der "undefinierte" Pseudo-Wert wird auch als "falsch" behandelt, obwohl das hier etwas wilder wird. – Pointy

+0

bearbeitet: jetzt true und false als Definitionen verwenden. Betrachtet man den ECMA-Standard, konvertiert er jeden Wert für boolean für den Test über toBoolean, gibt aber nach dem Testen den Wert selbst zurück. – mdma

9

denken Sie nicht, es als „oder“ ist zu schreiben. Es ist mehr wie ein Flow-Control-Gerät innerhalb eines Ausdrucks. Der Wert von a || Ausdruck ist der Wert des ersten Teilausdrucks, der "truthy" ist. Somit hält die Auswertung der Reihe von Teilausdrücken an einem gewissen Punkt, als ob

expr1 || expr2 || expr3 

waren
(function() { 
    var rv = expr1; 
    if (rv) return rv; 
    rv = expr2; 
    if (rv) return rv; 
    return expr3; 
})() 
1

Einige Werte, wie Null, "" oder undefined, werden als falsch behandelt. Alles andere ist wahr, daher gibt der Operator || nur den ersten Wert ungleich null (dh wahr) in dem Paar zurück, das er angegeben hat. Dies ist nützlich für Tricks wie den obigen Code, aber ich vermute, dass es nicht zur Sprache hinzugefügt wurde, nur um die ungerade if-Anweisung zu überspringen.

Ich vermute, dass es als Leistungsoptimierung entstanden sein kann, da die höheren Sprachen (wie BASIC ... ja, vielleicht eine ungerade Definition der höheren Ebene) feste Konstanten für wahr und falsch verwendet - oft 0 und -1, oder 0 und 1.

+2

Beobachten Sie die Definition "alles andere als Null". "falsch", "undefiniert" und "" sind alle nicht Null, werden aber nicht als truthy betrachtet. – Matchu

+0

@Matchu Danke, das ist mein Perl-Hintergrund durch. :(Fixed. –

+0

Ich denke gerne an ||s und &&'s Verhalten als 'der Wert des Arguments, dass bestimmte Wahrhaftigkeit oder Falschheit zurückgegeben wird'. –

2

Es ist nur so, wie es ist. ||, wie && ist ein Kurzschlussoperator, die Ausdrücke werden in der Reihenfolge ausgewertet, sie stoppen, nachdem ein Ausdruck die Kriterien erfüllt und das Ergebnis des Ausdrucks ergibt.Das gleiche gilt für &&:

var myObj = { "Test": { "Foo":"Bar" } }; 
var myObj2 = { "Foo": "Bar" }; 

alert(myObj.Test && myObj.Test.Foo); // will alert "Bar"; 
alert(myObj2.Test && myObj2.Test.Foo); // will alert undefined; 
Verwandte Themen