De acuerdo con ECMA-262, parte 11.13, siguiente es la lista exhaustiva de operadores de asignación compuestos: *= /= %= += -= <<= >>= >>>= &= ^= |=
.
De acuerdo con la parte 11.11, var c = a || b
pondrá a
valor en c
si ToBoolean(a)
es verdadero y pondrá b
valor en c
caso contrario. Como tal, el OR lógico se usa a menudo como el operador de fusión, por ejemplo
function (options) {
options = options || {};
}
Con suficiente frecuencia, se unen se utiliza para especificar el valor predeterminado para la variable, como se ha mostrado arriba a = a || b
.
Parece que el operador de asignación compuesta ||=
sería muy útil, que permite escribir el código anterior de una forma más corta y más limpio: a ||= b
. Sin embargo, no está allí (aunque *=
, +=
y otros operadores de asignación compuestos son).
La pregunta es, ¿por qué?
fuente
+=
,*=
,-=
,/=
, ¿por qué no lo haría%=
el trabajo?).angle %= 360
overtexIndex %= numberOfVertices
(para la lista de vértices de un polígono cerrado).||=
y&&=
vendría pronto: "Puede que le agrade saber que para JS2 / ES4, || = y && = también se están agregando. || = es lo más importante útil de los dos, pero no hay razón para dejar la forma de asignación de operaciones de && out ". .Respuestas:
Una posible razón es que los operadores lógicos
&&
y||
tienen un comportamiento de "cortocircuito". El operando derecho de&&
y||
no se evalúa a menos que sea necesario. Quizás por esta razón, los diseñadores de lenguaje decidieron que el significado de una expresión comoa ||= f()
no era obvio, por lo que es mejor dejar de lado a estos operadores.fuente
a ||= b
debería interpretarse comoa = a || b
, pero en realidad puede serloa || a = b
(como en Ruby ). Pueden ser diferentes si el setter tiene efectos secundarios. Elegir uno puede ser malo para los usuarios del otro campamento. Personalmente, me gusta ela || a = b
camino (el camino de Ruby), pero no estoy seguro de si todos están contentos con eso.La respuesta general a todas las preguntas sobre "por qué no se implementó esta característica del lenguaje" es que el equipo que diseñó el lenguaje decidió que el beneficio no superaba el costo.
El costo puede tomar muchas formas. Implementar una característica del lenguaje requiere tiempo y esfuerzo, pero también existe el costo intrínseco de la complejidad: ¿la característica hace que el lenguaje sea más complejo o ambiguo, en proporción a su beneficio potencial?
El
||=
operador hipotético hace algo fundamentalmente diferente de los otros operadores de asignación compuesta. Mientras que los otros operadores son de naturaleza puramente matemática, este es diferente: sustituye un valor por otro (en el contexto que describió).Dada esta ambigüedad (el operador realiza dos funciones diferentes, según el contexto), no es difícil ver por qué no se incluyó en el lenguaje. Aunque tú afirmas que cambiar
a
realizar una fusión nula es una característica valiosa, el beneficio es mucho menos claro para mí. Si se va a producir una sustitución de valores, parece lógico (y más claro) tener ambos valores en el lado derecho del signo igual, para proporcionar una indicación visual de que tal sustitución puede ocurrir.
C # tomó una ruta diferente y utiliza un operador específico para la fusión nula.
fuente
foo = foo || bar
requiere que escribafoo
dos veces. Esto es engorroso y propenso a refactorizar errores tipográficos.||=
como operador de fusión nula no es intuitivo y, de hecho, parece obtuso en forma de código. Donde se vuelve útil es cuando intentas hacer matemáticas booleanas.function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
Tienes razón,
||=
es una construcción útil. Existe en Perl.De hecho, Perl pone a su disposición todo esto :
Algunos de estos son geniales (
.=
agrega algo al final de una cadena), otros no tanto (&&=
supongo que la variable se establecería en el lado derecho si tanto ella como la variable son verdaderas. Pero, ¿por qué harías esto? ?)Lo que se incluye en un lenguaje es realmente una característica de su filosofía de diseño.
fuente
&&=
significa / hace.