¿Por qué (![]+[])[+!![]+[]]
productos "a"
paso a paso: esto se analiza en: (![]+[])
y [+!![]+[]]
. El primer bit ya fue explicado por artemb: []
es una matriz. Negándolo, ![]
evalúa a un booleano, false
- así es como funciona !
cuando se aplica a algo que no es null
o indefinido. De nuevo, como lo señala artemb, al anexar este +[]
se fuerza que el booleano se convierta en una cadena. Eso es porque el +
es un operador de concatenación de cadenas. El booleano false
se convierte a su representación de cadena, "false"
.
Luego, el segundo bit, [+!![]+[]]
. En primer lugar, el [
externo y el ]
sirven para tratar la cadena anterior, que acabamos de derivar es igual a "false"
como una matriz de caracteres. Al poner un índice entero dentro de [
y ]
, obtiene el carácter en un índice en particular. Entonces lo que queda es +!![]+[]
Esto consta de 4 piezas: +
, !![]
, +
y []
. Primero se evalúa !![]
.Ya vimos que ![]
es un booleano false
por lo que anteponer otro !
lo niega, y produce true
. Lo siguiente que lo que sucede es que el +
en +!![]
consigue aplicada, y mediante la aplicación de +
que convierte el booleano true
en la representación de los números, que es 1
(por lo +true
es 1
) El +[]
que sigue hace una cadena de nuevo desde que 1
rendimiento "1"
pero realmente no tiene sentido, la expresión más corta (![]+[])[+!![]]
ya produce a
. Agregar +[]
tampoco hace daño, la expresión resultante es simplemente ["1"]
en lugar de [1]
. Mi corazonada es que cuando se aplica []
a una matriz, lo que esté dentro de []
se forzará en un número, que para "1"
daría 1
nuevamente. Entonces, de cualquier manera, +!![]+[]
evalúa a 1
, haciendo la expresión final: "false"[1]
que está diciendo: dame el carácter en el índice 1 de la cadena "false"
, y como por defecto las matrices comienzan en 0
en javascript, este es el segundo caracter de "false"
, y a
.
si está interesado en cómo funcionan los idiomas, nada mejor que escribir un compilador para usted mismo, que básicamente le enseñará el idioma y sus aspectos internos. – Chii
Gracias por todas las respuestas. Sabía que Javascript era mágico, pero algunas de las cosas que hace es peligroso ... – prafulfillment