validar validacion tablas orientado objetos formularios formulario enviar ejemplos con clases antes javascript logic

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 de getFoo().theAnswer = 42 o matriz indexando getArray() = 42 lugar de getArray()[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:

Assignment

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!''); }