¿Puedes explicar cómo funciona letras[pasar[i]] = (letras[pasar[i]] || 0) + 1 ?
Esta línea agrega letras de pass al objeto de letters como claves y su número ocurre en el valor.
Entonces, por ejemplo, para pass = "aabbc" tendrás letters iguales a
{ "a":2, "b":2, "c":1 } El operador de la derecha ( (letters[pass[i]] || 0) + 1 ) se puede dividir en dos: letters[pass[i]] || 0 comprueba si letters tienen una clave de valor pass[i] , si es así, la expresión tendrá su valor, si no, obtendremos el valor después de || - en este caso 0 . Al valor de esta expresión le sumamos siempre 1 .
Además, podríamos convertir esta línea en algo como esto:
if(letters[pass[i]]) { letters[pass[i]]++; } else { letters[pass[i]] = 1; } Sobre el || operador en asignación de valor puede leer más, por ejemplo, aquí
Comencemos desde adentro hacia afuera, como lo hace JavaScript. :-)
(letters[pass[i]] || 0) + 1Que:
pass[i] que obtiene la letra del índice i de pass (que parece ser una cadena)letters ( letters[pass[i]] ). Obtendrá un número que se colocó allí antes o, si no hay una propiedad para esa letra (todavía), obtendrá el valor undefined .(the value) || 0 el || operator funciona bastante especialmente en JavaScript: evalúa su operando de la izquierda y, si ese valor es verdadero , toma ese valor como resultado; de lo contrario, evalúa su operando de la derecha y toma ese valor como resultado. undefined es un valor falso, por lo que undefined || 0 es 0 . Esto es para manejar la primera vez que se ve una carta.1 al resultado que obtuvo de || . Básicamente, eso es agregar uno al valor de la propiedad para la letra en letters , lo que permite no haber visto esa letra antes a través de || .
Luego almacena el resultado en la propiedad.