2011-05-01 19 views
7

me gustaría preguntar por qué¿Por qué "alerta (3> 2> 1)" alerta "falsa"

alert(3>2>1); // (1) 

regresa FALSO en Javascript.

sé que la correcta es:

alert(3>2 && 2>1); // (2) 

Pero el código 1 debe devolver, ya sea un mensaje de error o VERDADERO! ¿Hay alguna razón específica por la cual esta ecuación arroja FALSO?

+3

mi suposición es (1) se interpreta como 'verdadera> 1' pero esto es una conjetura salvaje – Zlatev

Respuesta

6

Primero 3>2 se evalúa como TRUE, que probablemente se convierte implícitamente en 1, por lo que termina en , que es FALSE.

Es posible que desee un error aquí, pero Javascript está muy débilmente tipado, por lo que intentará realizar conversiones implícitas, sin quejarse.

EDIT:

así que usted está preguntando por qué la sintaxis del lenguaje de programación no siempre coincide con la notación matemática? Yo diría que (1) tienen diferentes prioridades y (2) tiene más sentido para el compilador hacerlo de otra manera.

Esto no es raro sin embargo:

  • "x = 3" (declaración) y x = 3 (asignación)
  • "x >> 1" (mucho más que 1) y x >> 1 (BitShift)
  • "a | b" (a divide b) y a | b (OR bit a bit).

La lista es interminable ...

4

Está siendo evaluado como:

+(3>2) > 1 

¿Qué es la misma que:

+(true) > 1 

que finalmente es:

1 > 1 = false 

Pero bueno, al menos 3 > 2 > 0 va a funcionar;)

31

si se agrega paréntesis para mostrar cómo se está interpretando JavaScript, se vuelve mucho más claro:

alert((3 > 2) > 1); 

Vamos a recoger esto aparte. Primero, evalúa 3 > 2. Sí, tres es mayor que dos. Por lo tanto, ahora tiene esto:

alert(true > 1); 

true es obligada a un número. Ese número es 1. 1 > 1 es obviamente falso. Por lo tanto, el resultado es:

alert(false); 
+0

Sí chicos que saben lo que es sucediendo. Estoy preguntando por qué ... ¿Por qué no arreglaron eso? – George

+13

@George - ... porque no está roto. –

+1

¿Reparar qué? Funciona como deberia. –

0

Lets descomponerlo fundamentalmente, sus dos> operadores con la misma precedencia, Tan que se corre por primera vez?

JavaScript tiene precedencia del operador asignado, medida por operador tabla de precedencia descargado de MDN

Mayor que (>) (11 en la tabla) se ejecuta de izquierda a derecha, por lo que 3> 2 carreras primero que evalúa como TRUE

así que ahora tenemos VERDADERO> 1,

cuando JavaScript considera que hay dos tipos diferentes de valores (bool y número aquí) para la comparación, el tipo de coacción sucederá lo que significa TRUE será forzada (conversión de tipo) a 1,

Así JavaScript se ejecutará como 1> 1 que se traducirá como FALSO

enter image description here