style link img attribute javascript

javascript - link - title css



(![]+[])[+[]]... Explica por qué funciona (1)

Como @Mauricio comentó (![]+[])[+[]] Es "f" (el primer carácter de "falso"), (![]+[])[+!+[]]) Es "a ", etc ...

¿Como funciona?

Examinemos el primer caracter, ''f'':

(![]+[])[+[]]; // ''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 verdad y aplicando el operador lógico (!) NO unario, produce el valor false , por ejemplo.

![]; // false, it was truthy !{}; // false, it was truthy !0; // true, it was falsey !NaN; // true, it was falsey

Después de esto, tenemos el segundo operando de la adición, una matriz vacía, [] , esto se hace para convertir el valor false en cadena, porque la representación de cadena de una matriz vacía es solo una cadena vacía, es equivalente a:

false+[]; // "false" false+''''; // "false"

La última parte, el par de corchetes después de los paréntesis, son el acceso a la propiedad, y reciben una expresión, que está formada por el operador Unario Plus aplicado de nuevo a una matriz vacía.

Lo que hace el operador Unary Plus es la conversión de tipo, a Number , por ejemplo:

typeof +"20"; // "number"

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:

+[]; // 0, because +[].toString(); // 0, because +""; // 0

Por lo tanto, podemos "decodificar" la expresión en algunos pasos:

(![]+[])[+[]]; (false+[])[+[]]; (false+'''')[+[]]; (false+'''')[0]; (''false'')[0]; // "f"

Tenga en cuenta que acceder a los caracteres utilizando la notación de corchetes en los valores de Cadena no era parte de ECMAScript 3rd. Especificación de la edición, (es por eso que el método charAt existió).

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 característica estaba disponible en un buen número de navegadores (incluso en IE8 (modo estándar)).

alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);

El resultado de este código es: fail . ¿Por qué?

Por cierto, (![]+[])[+!+[]] == ''false''[1] , ¿no ?. ¡Pero por qué ![]+[] == "false" y por qué +!+[] == 1 ?