¿Qué hacen las llaves en la declaración de cambio después del caso en es6?

3 minutos de lectura

Avatar de usuario de Aurimas
Aurimas

Cuál es la diferencia entre:

switch (expression) {
    case:
      somethings;
      break;
}

y

switch (expression) {
    case: {
      somethings;
      break;
    }
}

Al principio pensé que podría devolver un objeto literal así, pero resulta que es un error de sintaxis. ¿Cuál es la diferencia en realidad?

Ejemplo de otra pregunta: ¿Cómo pasar la declaración de cambio como argumento de función en Javascript ES6?

  • La sintaxis en ambos no es válida. El caso debe especificar algo para que coincida y la devolución requiere el return palabra clave.

    – cchamberlain

    27 de febrero de 2017 a las 8:38

  • ¿Por qué tiene declaraciones de ruptura en matrices en su ejemplo? Dé un ejemplo mínimo, completo y verificable.

    – cchamberlain

    27 de febrero de 2017 a las 17:12

  • Ejemplo proporcionado. Las declaraciones de ruptura se concibieron como opcionales, como en MDN

    – Aurimas

    27 de febrero de 2017 a las 21:54

  • ¿Puedes explicar un voto negativo?

    – Aurimas

    28 de febrero de 2017 a las 15:49

  • Alguien debería poder presionar f12 y copiar/pegar su ejemplo en la consola de Chrome. Intentalo.

    – cchamberlain

    28 de febrero de 2017 a las 17:49

Las llaves usadas de esta manera establecen su propio alcance de bloque, en el que puede definir let variables o const constantes:

switch (false) {
    case true: {
      let x = "bar";
      console.log(x);
      break;
    }

    case false: {
      let x = "baz";
      console.log(x);
      break;
    }
}

El ejemplo arrojaría sin alcances de bloques anidados, ya que múltiples let/const las declaraciones con el mismo identificador no están permitidas dentro del mismo ámbito en Ecmascript 2015.

Tenga en cuenta que el switch La declaración crea un alcance de bloque en sí mismo, es decir, ya sea que use alcances de bloque anidados o no, let/const declaraciones dentro switch no se filtre en el ámbito principal.

Sin embargo, en el contexto de switchlos corchetes también se utilizan puramente decorativos, para resaltar visualmente los bloques del individuo case sucursales.

  • “Resaltan visualmente el bloque de cada caso” Eso sería decoración, no azúcar sintáctico. “esto no es realmente necesario en la mayoría de los casos” Sería más útil describir cuándo es necesario.

    – un mejor oliver

    27 de febrero de 2017 a las 10:31

  • Hm, ¿hay una definición estricta de azúcar sintáctico?

    usuario6445533

    27 de febrero de 2017 a las 10:35

  • azúcar sintáctico = sintaxis más simple. Agregar llaves no es exactamente más simple;) “Si no finaliza los casos con break, las diferentes variables let/const dentro de los casos pueden interferir entre sí” Es un alcance, por lo que dos declaraciones con el mismo identificador arrojarán un error, break O no.

    – un mejor oliver

    27 de febrero de 2017 a las 11:36

  • @zeroflagL Su segunda declaración es definitivamente correcta. ¡Me atrapaste! De todos modos, qué sintaxis es más simple se basa en gran medida en la opinión, por lo que lo dejo en el azúcar sintáctico. Ofreces un término alternativo en tu comentario, para que las personas puedan elegir su término favorito.

    usuario6445533

    27 de febrero de 2017 a las 12:28

  • “qué sintaxis es más simple está altamente basada en opiniones” Ese no es el punto. Llevar a ** b en lugar de Math.pow(a,b). Ambos significan lo mismo, pero uno es más corto/más conciso. Eso es azúcar sintáctico. Pero case 1: let x = 2 y `caso 1: { sea x = 2 } son completamente diferentes en su resultado. No es solo una sintaxis diferente, es es diferente. Una manzana no es azúcar sintáctica para una naranja.

    – un mejor oliver

    27 de febrero de 2017 a las 13:08

Avatar de usuario de Michal Miky Jankovský
Michal Miky Jankovský

tienes que usar corchetes:

  1. al crear más variables de ámbito de bloque (const / let) con el mismo nombre
    • de acuerdo con las especificaciones Documentos web de MDN
    • ERROR: error de sintaxis no detectado: el identificador ‘nombre de variable’ ya se ha declarado
  2. cuando usas eslint en la configuración predeterminada y usando incluso uno solo (const / let)
    • de acuerdo con la regla declaraciones de no-caso
    • ERROR: declaración léxica inesperada en el bloque de casos declaraciones sin mayúsculas y minúsculas

¿Ha sido útil esta solución?