2013-07-15 3 views
6

Kann jemand erklären, was diese Aussage bedeutet?Kann jemand bitte e = e || erklären x? Warum e zu e zuordnen?

e = e || x 

Insbesondere

e = e || window.event 

Das in einem Stück Code erscheint auf Suche.

Ich bin nicht zu einem vollständigen Verlust, aber mein Verständnis ist, dass es e und window.event (oder x/was auch immer) zu e zuweist. Es ist nur natürlich, oder?

Aber was ist der Wert bei der Zuordnung von e zu e? Sollte nicht e = window.event genug sein? Vielleicht hängt es davon ab, wie es benutzt wird?

+0

Ist das nicht '||' a boolean Operator zu sehen? Also sollte "e" danach entweder "wahr" oder "falsch" sein? –

+0

ist es "benutze e, wenn es bereits definiert/verfügbar ist, sonst verwende x". Es ist ein nettes Stück syntaktischen Zucker in Javascript, in Pseudo-Code, "wenn (existiert e) dann return e sonst zurück x". –

+5

@Cobra_Fast '||' gibt in Javascript nicht wahr/falsch zurück, es gibt das erste Objekt zurück, das "truthy" ist. – Matthew

Antwort

18

e = e || x ordnet x zu e zu, wenn e evalutes zu falsch ist.

Dies ist das gleiche wie:

if (!e) { 
    e = x; 
} 
// or 
e = e ? e : x 

Hier ist eine Tabelle, die zeigt, welche evalute zu falsch Werte: https://stackoverflow.com/a/7615236/603003

Die wichtigsten Werte sind: null und undefined.


Was bedeutet es in Ihrem Kontext? Sie wahrscheinlich eine Art von diesem Code haben:

function handler(e) { 
    e = e || window.event; 
} 

Wo handler ein Ereignis-Listener zu einem DOM-Element befestigt ist. Da ältere Versionen von IE das Ereignisobjekt nicht als Parameter übergeben haben, musste überprüft werden, ob der Parameter undefiniert war. Wenn letzteres der Fall ist, weist man das globale Objekt window.event (welches IE geliefert hat) e zu.

+0

Huch! Ich fühle mich dumm, daran hätte ich mich erinnern sollen. Es ist so einfach. Vielen Dank! – muiiu

6

nicht zuordnen Es ist nicht beide bis "e", nur derjenige, der null, 0, NaN, "" oder false auch nicht undefined, ist. Es bevorzugt den ursprünglichen Wert von "e" zu window.event, weil "e" auf der linken Seite von || ist, aber wenn es leer ist (einer dieser Werte, die ich aufgeführt habe), wird "e" window.event zugewiesen.

Es ist getan, weil Internet Explorer die Ereignisreferenz nicht als Parameter übergeben hat, sondern einfach an ein globales Symbol gebunden hat. Event-Handler wurden sehr oft geschrieben:

function someHandler(e) { 
    e = e || window.event; 
    // ... 
} 

Es wäre wahrscheinlich strenger gewesen „richtig“ zu schreiben:

function pedanticHandler(e) { 
    if (e === undefined) // or arguments.length == 0 perhaps 
    e = window.event; 
    // ... 
} 
+2

Insbesondere wenn e einen Wert hat, behält es seinen Wert bei. Wenn es nicht definiert ist, suchen wir anderswo nach einem Wert. –

+0

@JonKiparsky ja, erweitert :) – Pointy

+0

NaN löst auch den Standard ... – dandavis

2

es überflüssig ist e = e zuweisen, sie tun es als Teil dieser Aussage, weil es ist ein Idiom.

Die Anweisung überprüft, ob e definiert ist, und wenn dies nicht der Fall ist, wird sie mit dem folgenden Ausdruck initialisiert: ||. Dies funktioniert, denn wenn der Ausdruck || ausgewertet wird, stoppt der Interpreter die Auswertung, wenn der erste true Teil (von links) gefunden wird.

Insbesondere, wenn e wertet true dann Bewertung stoppt dann, und effektiv haben Sie e = e, die redundant ist. Wenn aber e nicht definiert ist oder false ergibt, wird der rechte Teil der || ausgewertet und e zugewiesen.

Ich persönlich würde eine if Aussage statt clever sein. Oder restrukturieren Sie den Code noch mehr, um if insgesamt zu vermeiden.

EDIT: Ich denke, der ursprüngliche Code ist fehlerhaft. Offensichtlich wird überprüft, ob e bereits initialisiert ist. Aber hier kann es sich selbst neu zugewiesen werden, wenn es bereits initialisiert ist und true auswertet. Dies kann unerwünschte Nebenwirkungen haben.

+0

Sie missverstehen den Code. – SLaks

+0

wirklich? mache ich? :) – akonsu

+0

Ja, wirklich, Sie tun – Bojangles

4

Sie missverstehen Betreiber.

Diese Zeile weist der Variablen e den Ausdrucke || x zu.

Der Wert e || x ist der erste truthy Wert.
Wenn e truthy ist, wird das e sein; Wenn e falsch ist, wird es x sein.

2

Wenn e ist undefined (oder null oder jeder anderer false-Wert), ist es mit x initialisiert.

Es ist implizit:

var e = e ? e : x; 
1

Es gesetzt e gleich entweder selbst (wenn es nicht null, nicht definiert oder falsch ist), ansonsten window.event.

Es ist wie wenn man sagt

if (!e) e = window.event; 
2

Es ist nicht beide Werte auf e zuweisen. Es ist nur ein Weg x-e zuzuweisen, wenn der ursprüngliche Wert von e ist null, undefined, 0, false, NaN oder eine leere Zeichenfolge (""). Wenn der ursprüngliche Wert e keiner der oben genannten Bedingungen entspricht, behält es den ursprünglichen Wert bei.

Im Grunde ist es eine Kurzform für:

if(!e) { 
    e = x; 
} 
+0

Oder NaN, zum Beispiel: parseInt ('lol') || 0 – Virus721

+0

@ Virus721 Danke! Das zur Antwort hinzugefügt. –

1

In Ihrem Beispiel e = e || window.event; ist äquivalent zu:

if(!e){ 
    e = window.event; 
} 
1

, wenn Sie einen Eventhandler zu einem

Elemente hinzufügen
document.addEventListener('click',handler,false); 

in Bei den meisten Browsern wird das Ereignis als erster Parameter übergeben.

handler=function(e){// e is the event in some browsers 
e=e||window.event; // but in some old browsers the event is window.event 
    // so you check if e(event) exists else you use window.event. 
    // '||' means or... 
    // e is already defined as a placeholder in the handler function 
    // so you don't need to put var infront of it 
} 
2

Die obige Antwort (ComFrek) ist korrekt. Die Grund es tut dies wegen der faulen Bewertung. Der boolesche Wert x || y, der langsam bewertet wird, wird zuerst x überprüfen. Wenn es TRUE auswertet (d. H. Nicht Null ist, nicht null ist), stoppt der Ausdruck und gibt TRUE zurück. Wenn x zu FALSE ausgewertet wird, wird y zurückgegeben.

Dies ist cleverer Code. Clever ist dumm. (Meinung) Als Betreuer, ziehe ich

if (!e) { 
    e = x; 
} 
+0

Einverstanden. C# hat eine etwas bessere Notation mit e = e ?? x; Die doppelte Fragezeichen macht es deutlicher, dass Sie überprüfen, ob etwas existiert, anstatt einen booleschen Wert zuzuweisen. –