¿Cuál es la diferencia entre una expresión y una statement en JS?

¿Cuál es la diferencia entre una statement y una expresión? ¿Cómo puedo saber que cada uno es?

¿Por qué el vacío transforma esto?

void function() { }(); 

en una expresión?

Y por qué esto funciona:

 something((something) => something + 2); 

y esto no

 something((something) => if (something) { something + 2 }); 

?

¡¡Gracias!!

Las declaraciones y expresiones son diferentes unidades de lenguaje. Lo que probablemente le está fallando es que JavaScript, a diferencia de otros idiomas, tiene lo que la especificación llama ExpressionStatement : puede tratar cualquier expresión como una statement (pero no puede tratar las declaraciones como expresiones). Entonces, por ejemplo, este es un JavaScript válido:

 flag && console.log("Hi there"); 

… mientras que en (digamos) Java no sería válido, porque si bien Java tiene algunas declaraciones específicas para permitir cosas similares a expresiones específicas (llamadas de método, por ejemplo), no tiene el estado de expresión general de JavaScript.

¿Por qué el void transforma esto?

 void function() { }(); 

en una expresión?

Porque el void es un operador . Evalúa su operando (lo que sea que lo siga), y luego establece su resultado en undefined . No tiene void que ver con el void que ves en lenguajes como C, C ++, Java o C #. Así que todo es una Expresión de Expresión . La única razón por la que necesita el void es que sin él, cuando el analizador espera ver una statement, la function palabra clave coloca al analizador en un estado en el que está esperando una statement de función, no una expresión. (Puede usar cualquier operador, no solo void , para poner el analizador en el estado de expresión; detalles en esta pregunta y sus respuestas ).

Y por qué esto funciona:

 something((something) => something + 2); 

y esto no

 something((something) => if (something) { something + 2 }); 

Debido a la forma en que las funciones de flecha están definidas por la especificación. Hay dos formas de función de flecha:

  • Unos con un cuerpo conciso (no {} )
  • Unos con un cuerpo verboso.

Ejemplo conciso:

 array.sort((a, b) => a - b); 

Ejemplo verboso equivalente:

 array.sort((a, b) => { return a - b; }); 

Las funciones de flecha con cuerpos concisos requieren que el cuerpo sea una expresión porque, como puede ver arriba, devuelven el resultado de la expresión. No puede usar una statement allí por la misma razón por la que no puede usar una statement en otros lugares donde se requiere una expresión: se necesita un valor de resultado para la statement de return implícita. Su segundo ejemplo, traducido a un cuerpo detallado, es este:

 something((something) => { return if (something) { something + 2 }; }); 

… lo que demuestra por qué no funcionó: tiene un if después de la return , pero la statement de return requiere un operando (expresión) o terminador de la statement.

Intereting Posts