const arr = [(firstName = 'hello')]¿Por qué el código anterior es un código válido en javascript? No entendí por qué esto no arroja ningún error.
Esto es lo que hace ese código y si es válido.
Ese código hace esto:
firstName = 'hello'; const arr = ['hello']; ... excepto 'hello' solo se evalúa una vez. (En el caso de un literal como 'hello' , no importa que solo se evalúe una vez, pero lo sería si 'hello' fuera una llamada de función que devolviera una cadena).
Es válido porque:
Usar el resultado de una operación de asignación es válido; el resultado de una operación de asignación es el valor que se asigna. Entonces, la expresión firstName = 'hello' da como resultado el valor 'hello' .
El operador de agrupación ( () ) se puede usar donde se puede usar cualquier expresión; el resultado de la operación de agrupación es el resultado de la expresión dentro de ella.
[x] crea una matriz con x en ella.
const arr = /*...*/ crea una constante (una variable de solo lectura) y le asigna el resultado de evaluar la expresión inicializadora (la expresión en el lado derecho de = ).
Entonces, todas las partes son válidas y están ensambladas de manera válida. Se declara el identificador arr ; se evalúa la expresión de asignación firstName = 'hello' , configurando firstName y dando como resultado 'hello' ; la operación de agrupación ('hello') se evalúa dando como resultado 'hello' ; el literal de matriz ['hello'] se evalúa creando una matriz; y la constante arr se inicializa con la referencia de matriz.
Una arruga es que parece que firstName es un identificador no declarado (su código no lo declara en ninguna parte, no hay let firstName o similar). Si realmente no está declarado, entonces esta es una de las desafortunadas peculiaridades de JavaScript en modo flexible: la asignación a un identificador no declarado crea implícitamente una variable global (lo llamo "El horror de los globales implícitos"). Esta es una de las muchas razones para usar el modo estricto ( "use strict" en la parte superior del archivo, o usar módulos nativos de JavaScript ["ESM"]; el cuerpo de una definición de class también es siempre estricto). En modo estricto, asignar a un identificador no declarado es el error que siempre debería haber sido.