Selon ECMA-262, une partie 11.13, suivant la liste exhaustive des opérateurs d'affectation composés: *= /= %= += -= <<= >>= >>>= &= ^= |=
.
Selon la partie 11.11, var c = a || b
mettra de la a
valeur dans c
si ToBoolean(a)
est vrai et mettra de la b
valeur dans c
sinon. En tant que tel, le OU logique est souvent utilisé comme opérateur de fusion, par exemple
function (options) {
options = options || {};
}
Assez souvent, soudent est utilisé pour spécifier la valeur par défaut pour la variable, comme cela a été indiqué ci - dessus: a = a || b
.
Il semble que l' opérateur d'affectation composé ||=
serait vraiment utile, ce qui permet d'écrire le code ci - dessus de façon plus courte et plus propre: a ||= b
. Cependant, il n'est pas là (bien que *=
, +=
et d'autres opérateurs d'affectation composés le soient).
La question est, pourquoi?
la source
+=
,*=
,-=
,/=
, pourquoi pas le%=
travail?).angle %= 360
ouvertexIndex %= numberOfVertices
(pour la liste des sommets d'un polygone fermé).||=
et&&=
viendrait bientôt: "Vous serez peut-être heureux d'apprendre que pour JS2 / ES4, || = et && = sont également ajoutés. || = est le plus utile des deux, mais il n'y a aucune raison de laisser la forme affectation-op de && out. " .Réponses:
Une raison possible est que les opérateurs logiques
&&
et||
ont un comportement « court-circuit ». L'opérande de droite de&&
et||
n'est évalué que si cela est nécessaire. C'est peut-être pour cette raison que les concepteurs de langage ont décidé que le sens d'une expression commea ||= f()
n'était pas évident, et que de tels opérateurs étaient donc mieux laissés de côté.la source
a ||= b
devrait être interprété commea = a || b
, mais en fait cela peut l'êtrea || a = b
(comme dans Ruby ). Ils peuvent être différents si le setter a un effet secondaire. Le choix de l'un peut être mauvais pour les utilisateurs de l'autre camp. Personnellement, j'aime laa || a = b
manière (la manière Ruby), mais je ne sais pas si tout le monde est satisfait de cela.La réponse générale à toutes les questions sur «pourquoi cette fonction de langue n'a pas été implémentée» est que l'équipe qui a conçu la langue a décidé que l'avantage ne l'emportait pas sur le coût.
Le coût peut prendre plusieurs formes. Il faut du temps et des efforts pour mettre en œuvre une fonctionnalité de langue, mais il y a aussi le coût intrinsèque de la complexité: la fonctionnalité rend-elle la langue plus complexe ou ambiguë, hors de proportion avec son avantage potentiel?
L'
||=
opérateur hypothétique fait quelque chose de fondamentalement différent des autres opérateurs d'affectation composés. Alors que les autres opérateurs sont de nature purement mathématique, celui-ci est différent: il substitue une valeur à une autre (dans le contexte que vous avez décrit).Compte tenu de cette ambiguïté (l'opérateur remplit deux fonctions différentes, selon le contexte), il n'est pas difficile de voir pourquoi il n'a pas été inclus dans le langage. Bien que vous déclariez que changer
à
effectuer une coalescence nulle est une caractéristique précieuse, l'avantage est beaucoup moins clair pour moi. Si une substitution de valeur doit se produire, il semble logique (et plus clair) d'avoir les deux valeurs sur le côté droit du signe égal, pour fournir une indication visuelle qu'une telle substitution peut se produire.
C # a pris un chemin différent et utilise un opérateur spécifique pour la coalescence nulle.
la source
foo = foo || bar
vous devez taperfoo
deux fois. Ceci est à la fois lourd et susceptible de refactoriser les fautes de frappe.||=
comme un opérateur de coalescence nul n'est pas intuitive et semble en fait obtuse sous forme de code. Lorsque cela devient utile, c'est lorsque vous essayez de faire des mathématiques booléennes.function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
Vous avez raison, c'est
||=
une construction utile. Il existe en Perl.En fait, Perl met tout cela à disposition:
Certains d'entre eux sont excellents (
.=
ajoute quelque chose à la fin d'une chaîne), d'autres moins (&&=
??? Je suppose que la variable serait réglée sur le côté droit si elle et la variable sont vraies. Mais pourquoi voudriez-vous jamais faire cela ?)Ce qui est inclus dans une langue est vraiment une caractéristique de sa philosophie de conception.
la source
&&=
signifie / fait.