javascript - validacion - Error de referencia: lado izquierdo no válido en la asignación
validar formulario javascript html5 (2)
Mi código para un juego de tijeras de papel de piedra (llamado lanzamiento) es el siguiente:
var toss = function (one,two) {
if(one = "rock" && two = "rock") {
console.log("Tie! Try again!");
}
// more similar conditions with `else if`
};
Cuando entro en los parametros.
toss("rock","rock")
Obtengo este código de error:
"ReferenceError: lado izquierdo no válido en la asignación"
¿Como arreglarlo? ¿Qué significa este error y qué otros casos cuando este error puede ocurrir?
Razones comunes del error:
- uso de la asignación (
=
) en lugar de la igualdad (==
/===
) - Asignación al resultado de la función
foo() = 42
lugar de pasar argumentos (foo(42)
) - simplemente faltan nombres de miembros (es decir, asumiendo alguna selección predeterminada):
getFoo() = 42
lugar degetFoo().theAnswer = 42
o matriz indexandogetArray() = 42
lugar degetArray()[0]= 42
En este caso particular, desea utilizar ==
(o mejor ===
- ¿Qué es exactamente el tipo Coercion en Javascript? ) Para verificar la igualdad (como if(one === "rock" && two === "rock")
, pero es la razón real por la que está recibiendo el error es más complicado.
El motivo del error es la precedencia del operador . En particular, estamos buscando &&
(precedencia 6) y =
(precedencia 3).
Pongamos llaves en la expresión de acuerdo con la prioridad - &&
es mayor que =
por lo que primero se ejecuta de manera similar cómo se haría 3+4*5+6
como 3+(4*5)+6
:
if(one= ("rock" && two) = "rock"){...
Ahora tenemos una expresión similar a múltiples asignaciones como a = b = 42
que, debido a la asociatividad de derecha a izquierda, se ejecuta como a = (b = 42)
. Así que añadiendo más llaves:
if(one= ( ("rock" && two) = "rock" ) ){...
Finalmente llegamos al problema real: ("rock" && two)
no se puede evaluar a l-value que se puede asignar a (en este caso particular, será valor de two
como truthy ).
Tenga en cuenta que si utiliza llaves para igualar la prioridad percibida que rodea a cada "igualdad" con llaves, no obtendrá errores. Obviamente, eso también produce un resultado diferente del que esperaría: cambia el valor de ambas variables y hace &&
en dos cadenas "rock" && "rock"
dan como resultado "rock"
(que a su vez es veraz) todo el tiempo debido al comportamiento de logial && :
if((one = "rock") && (two = "rock"))
{
// always executed, both one and two are set to "rock"
...
}
Para obtener más detalles sobre el error y otros casos en los que puede ocurrir, consulte la especificación:
LeftHandSideExpression = AssignmentExpression
...
Lance una excepción SyntaxError si se cumplen todas las condiciones siguientes:
...
IsStrictReference (lref) es verdadero
Expresiones del lado izquierdo
y el tipo de especificación de referencia que explica IsStrictReference:
... las llamadas a funciones están permitidas para devolver referencias. Esta posibilidad se admite únicamente por el bien de los objetos del host. Ninguna función ECMAScript incorporada definida por esta especificación devuelve una referencia y no hay ninguna disposición para que una función definida por el usuario devuelva una referencia ...
Tienes que usar ==
para comparar (o incluso ===
, si quieres comparar tipos). Un solo =
es para la asignación.
if (one == ''rock'' && two == ''rock'') {
console.log(''Tie! Try again!'');
}