alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
El resultado de este código es: fail
. ¿Por qué?
Por cierto (![]+[])[+!+[]] == 'false'[1]
, ¿no ?. Pero ¿ ![]+[] == "false"
por qué y por qué +!+[] == 1
?
javascript
cdxf
fuente
fuente
(![]+[])[+[]]
es "f" (el primer carácter de "falso"),(![]+[])[+!+[]]
es "a", etc.alert(![]+[])
entoncesalert(+!+[])
y verás.Respuestas:
Como comentó @Mauricio
(![]+[])[+[]]
es "f" (el primer carácter de "falso"),(![]+[])[+!+[]])
es "a", etc ...¿Como funciona?
Examinemos el primer carácter, 'f':
La primera parte de la expresión, entre paréntesis, está compuesta por
![]+[]
, el primer operando del operador de suma es![]
y produciráfalse
, porque un objeto de matriz, como cualquier otra instancia de objeto, es veraz y aplica la lógica (!) NOT unaria operador, produce el valorfalse
, por ejemplo.Después, tenemos el segundo operando de la suma, un Array vacío
[]
, esto se hace solo para convertir elfalse
valor a String, porque la representación de cadena de un arreglo vacío es solo una cadena vacía, es equivalente a:La última parte, el par de corchetes después del paréntesis, son el descriptor de acceso a la propiedad y reciben una expresión, que está formada por el Operador Unario Plus aplicado a una matriz vacía nuevamente.
Lo que hace el operador Unary Plus es la conversión de tipos
Number
, por ejemplo:Una vez más, esto se aplica a una matriz vacía y, como dije antes, la representación de cadena de una matriz es una cadena vacía, y cuando convierte una cadena vacía en número, se convierte a cero:
Por lo tanto, podemos "decodificar" la expresión en algunos pasos:
Tenga en cuenta que acceder a los caracteres mediante el uso de la notación de corchetes en los valores de cadena no formaba parte del ECMAScript 3rd. Especificación de la edición, (por eso
charAt
existía método).Sin embargo, este tipo de "propiedades de índice" que representan los caracteres de una cadena se estandarizaron en ECMAScript 5, e incluso antes de la estandarización, la función estaba disponible en un buen número de navegadores (incluso en IE8 (modo estándar)).
fuente
int
tipo de datos en el idioma, de hecho, todos los números tienen un formato de 64 bits de doble precisión (valores IEEE 754), aunque algunos operadores trabajan internamente con valores enteros (como los operadores bit a bit), el resultado es siempre un doble . El'i'
viene en este ejemplo deundefined
, pero podría provenir deInfinity
por ejemplo:(+!+[]/+[+[]]+[])[!+[]+!+[]+!+[]]
=>(1/0+'')[3]
=>(Infinity+'')[3]
=>'i'
"falseundefined"
(construido usando :)[![]]+[][[]]
en el que el índice de "i" es 10.+!+[]+[+[]]
da"10"
. Esto se usa para extraer la "i" (los índices de cadenas se pueden usar en javascript si aparentemente se pueden convertir en números enteros). La construcción final que lo produce es:([![]]+[][[]])[+!+[]+[+[]]]