¿Por qué sucede que el siguiente código arroja el error Uncaught ReferenceError: Cannot access 'arr' before initialization
function swap(str,a,b){ let arr = str.split("") [arr[a],arr[b]] = [arr[b],arr[a]] return arr.join("") } swap("abcde",2,4) // throws error "Uncaught ReferenceError: Cannot access 'arr' before initialization"Pero tan pronto como inserto una declaración ficticia entre las líneas 2 y 3, sorprendentemente el código comienza a funcionar.
function swap(str,a,b){ let arr = str.split("") 23456; // this could be anything like a variable declaration, or any valid javascript statement [arr[a],arr[b]] = [arr[b],arr[a]] return arr.join("") } swap("abcde",2,4) // returns "abedc" as expected Me sorprende ver por qué esto funciona ahora. Debería haber dado error en ambos casos, o debería haber funcionado en ambos casos. Estoy seguro de que en el primer caso, la split no termina su trabajo hasta que se ejecuta la línea de tiempo 3 y en el segundo caso, obtiene suficiente tiempo debido a 1 instrucción adicional en el medio. Pero aún me encantaría obtener una explicación clara de por qué se está comportando así. No estoy seguro de si esto es igual para todos los navegadores, pero lo probé en Chrome y Safari en Mac, y ambos dieron el mismo error.
El punto y coma marca la diferencia. JavaScript cree que desea acceder al resultado de str.split("")[arr[a],arr[b]] como una matriz. Esta es la razón por la cual los formateadores automáticos de JavaScript insertarán un punto y coma al comienzo de la siguiente línea como esta:
function swap(str,a,b){ let arr = str.split("") ;[arr[a],arr[b]] = [arr[b],arr[a]] // <--- semicolon in front of this line return arr.join("") }Creo que su sintaxis está un poco dividida, devolverá una matriz y seguirla con corchetes se traduce como si estuviera tratando de acceder a un elemento de la matriz. Creo que solo le falta el punto y coma.
let arr = str.split("")[arr[a],arr[b]] = [arr[b],arr[a]] function swap(str,a,b){ let arr = str.split(""); [arr[a],arr[b]] = [arr[b],arr[a]] return arr.join("") } console.log(swap('some tpyo', 6, 7))