Như @Mauricio đã nhận xét (![]+[])[+[]]là "f" (ký tự đầu tiên của "false"), (![]+[])[+!+[]])là "a", v.v.
Làm thế nào nó hoạt động?
Hãy kiểm tra ký tự đầu tiên, 'f':
(![]+[])[+[]]; // 'f'
Phần đầu tiên của biểu thức — giữa các dấu ngoặc — được tạo bởi ![]+[], toán hạng đầu tiên của toán tử Phép cộng là ![]và nó sẽ tạo ra false, bởi vì một đối tượng mảng — như bất kỳ cá thể Đối tượng nào khác — là trung thực và áp dụng Logical (!) NOT một bậc chẳng hạn, nó tạo ra giá trị false.
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
Sau đó, chúng ta có toán hạng thứ hai của phép cộng, một Mảng trống [], điều này được thực hiện chỉ để chuyển đổi falsegiá trị thành Chuỗi, vì biểu diễn chuỗi của một mảng trống chỉ là một chuỗi trống, tương đương với:
false+[]; // "false"
false+''; // "false"
Phần cuối cùng, cặp dấu ngoặc vuông sau dấu ngoặc, chúng là công cụ truy cập thuộc tính và chúng nhận được một biểu thức, được hình thành bởi Toán tử Unary Plus được áp dụng lại cho một mảng trống.
Những gì Toán tử Unary Plus làm là chuyển đổi kiểu Number, ví dụ:
typeof +"20"; // "number"
Một lần nữa, điều này được áp dụng cho một Mảng trống và như tôi đã nói trước đây, biểu diễn Chuỗi của Mảng là một chuỗi rỗng và khi bạn chuyển đổi một chuỗi rỗng thành Số, nó sẽ được chuyển đổi thành 0:
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
Do đó, chúng ta có thể "giải mã" biểu thức thành một số bước:
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
Lưu ý rằng việc truy cập các ký tự bằng cách sử dụng ký hiệu dấu ngoặc trên các giá trị Chuỗi không phải là một phần của ECMAScript 3. Đặc tả Phiên bản, (đó là lý do tại sao charAtphương pháp này tồn tại).
Tuy nhiên, loại "thuộc tính chỉ mục" đại diện cho các ký tự của một chuỗi đã được tiêu chuẩn hóa trên ECMAScript 5 và thậm chí trước khi tiêu chuẩn hóa, tính năng này đã có sẵn trong một số trình duyệt (ngay cả trong IE8 (chế độ tiêu chuẩn)).