7
votes

Quelqu'un peut-il s'il vous plaît expliquer e = e || X? Pourquoi assigner e à e?

Quelqu'un peut-il expliquer ce que cet énoncé signifie? XXX PRE>

Spécialement, P>

e = e || window.event


6 commentaires

N'est pas || un opérateur booléen? Donc, E devrait être soit true ou false après cela?


C'est «Utilisez E s'il est déjà défini / disponible, utilisez sinon X». C'est un peu de sucre syntaxiste dans JavaScript, en pseudo-code, "si (existe e), puis renvoie e d'autre retour x".


@Cobra_fast || ne renvoie pas vrai / faux dans JavaScript, il renvoie le premier objet "Truthy".


C'est-à-dire ne pas transmettre l'argument de l'événement au gestionnaire


Dupliqué possible de JavaScript ou (||) Affectation de la variable Explication


Dupliquer possible de En JavaScript, qu'est-ce que cela signifie quand il y a un opérateur logique dans une déclaration de variable? (la dupe possible était elle-même une dupe possible!)


10 Réponses :


6
votes

Il n'attribuait pas em> à "e", juste celui qui n'est pas non plus non supérieur à non défini code>, null code>, 0 , nan code>, "" code> ou false code>. Il préfère la valeur d'origine de "E" à window.event code> parce que "E" est à gauche de || code>, mais s'il est vide (une de ces valeurs i listé) alors "e" sera attribué à "code> window.event" code>.

C'est fait parce que Internet Explorer n'a pas transmis la référence d'événement comme paramètre, simplement reliant simplement un symbole global. Les gestionnaires d'événements ont été très souvent écrits: p> xxx pré>

Cela aurait probablement été plus rigoureusement "correct" pour écrire: P>

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


6 commentaires

Spécifiquement, si e a une valeur, il conserve sa valeur. Si cela est indéfini, nous regardons ailleurs pour une valeur.


@Jonkiparsky oui, étendu :)


@VivinpaliaIth Oui, c'est! (... mais seulement si quelqu'un de votre équipe déclare vraiment la variable non définie ;)).


@Crazytrain je pense qu'il (y compris moi) comparé typeof e === "indéfini" à e === non défini , pas sur si (e) en général.


Veuillez prendre toutes les discussions prolongées pour discuter. Ce n'est pas un bon endroit pour eux. Si vous avez des éclaircissements pour la question ou une réponse, veuillez éditer cet article avec les informations pertinentes.


@Crazytrain

Il est redondant d'assigner e = e , ils le font dans le cadre de cette instruction car c'est un idiome.

La déclaration vérifie si E est défini et s'il n'est pas alors, il l'initialise avec l'expression qui suit || . Cela fonctionne parce que lorsque || expression est évalué que l'interprète arrête l'évaluation lorsque le premier true partie (à gauche) est trouvé.

en particulier, si E est évalué vers true puis l'évaluation s'arrête à droite puis et efficacement, vous avez E = E , qui est redondant. Mais si E est indéfini ou évalue vers false , la partie droite du || est évaluée et attribuée à E .

J'utiliserai personnellement un si est au lieu d'être intelligent. Ou restructurer le code encore plus pour éviter si complètement.

Edit: Je pense que le code d'origine est buggy. Clairement, l'intention est de vérifier si E est déjà initialisé. Mais ici, il peut être réaffecté à lui-même s'il est déjà initialisé et évalue à vrai . Cela peut avoir des effets secondaires indésirables.


7 commentaires

4
votes

Vous êtes des opérateurs malentendants.

Cette ligne attribue l'expression e || x à la variable E .

la valeur de e || x est la première valeur de la vérité.
Si E est une vérité, qui sera e ; Si E est FALSY, il sera x .


0 commentaires

18
votes

e = e || x attribue x à E si E est évaluée sur false.

Ceci est identique à: < Pre> xxx

Voici une table qui montre quelles valeurs évaluent false : https : //stackoverflow.com/a/7615236/603003

Les valeurs les plus importantes sont les suivantes: null et non défini .


Qu'est-ce que cela signifie dans votre contexte? Vous avez probablement une sorte de ce code: xxx

gestionnaire est un auditeur d'événement attaché à un élément DOM. Étant donné que les anciennes versions de IE n'ont pas passé l'objet événement sous forme de paramètre, il a dû vérifier si le paramètre était indéfini . Si ce dernier était le cas, on attribue l'objet global window.event (qui est fourni) à E .


1 commentaires

Yikes! Je me sens stupide, j'aurais dû me rappeler ça. C'est tellement simple. Merci!



2
votes

si E est non défini (ou null ou tout autre false valeur), il est initialisé avec x .

Il est implicitement: xxx


0 commentaires

1
votes

Il est égal à l'égal à lui-même (s'il n'est pas nul, non défini ou faux) sinon window.event.

C'est comme dire P>

if (!e) e = window.event;


0 commentaires

2
votes

Il n'attribuait pas les deux valeurs à E . C'est juste une façon d'attribuer x à E si la valeur d'origine de E est null , non défini , 0 , false , nan ou une chaîne vide ( "" ). Si la valeur d'origine de E ne correspond à aucune des conditions susmentionnées, il conserve la valeur d'origine.

Fondamentalement, c'est une forme abrégée pour: xxx


1 commentaires

@ Virus721 merci! Ajouté que à la réponse.



1
votes

dans votre exemple e = e || window.event; est équivalent à: xxx


0 commentaires

1
votes

Lorsque vous ajoutez un événementHandler à un élément xxx pré>

dans la plupart des navigateurs, il transmet l'événement comme premier paramètre. P>

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
}


0 commentaires

2
votes

La réponse ci-dessus (COMFREEK) est correcte. La raison Cela fait ceci est dû à l'évaluation paresseuse. Le booléen x || y , évalué paresseusement vérifiera x d'abord. Si elle évalue à true (c'est-à-dire, non nulle, non null), alors l'expression arrête et retourne vrai. Si x évalue vers false , il retournera y .

Ceci est le code intelligent. Clever est stupide. (avis) En tant que mainteneur, je préfère voir xxx


1 commentaires

D'accord. C # a une notation légèrement meilleure avec e = e ?? X; Le double point d'interrogation donne clairement clairement que votre vérification si quelque chose existe, plutôt que d'assigner un booléen.