ตามที่ @Mauricio แสดงความคิดเห็น(![]+[])[+[]]คือ "f" (อักขระตัวแรกของ "false") (![]+[])[+!+[]])คือ "a" ฯลฯ ...
มันทำงานอย่างไร?
ลองตรวจสอบอักขระตัวแรก 'f':
(![]+[])[+[]]; // 'f'
ส่วนแรกของนิพจน์ - ระหว่างวงเล็บ - ประกอบด้วย![]+[]ตัวถูกดำเนินการตัวแรกของตัวดำเนินการการเพิ่มคือ![]และจะสร้างfalseขึ้นเนื่องจากอ็อบเจ็กต์อาร์เรย์ - เช่นเดียวกับอินสแตนซ์ออบเจ็กต์อื่น ๆ เป็นความจริงและการใช้ตรรกะ (!) ไม่ใช่ยูนารี ตัวดำเนินการจะสร้างค่าfalseเช่น
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
หลังจากนั้นเรามีตัวถูกดำเนินการที่สองของการเพิ่ม Array ว่าง[]ซึ่งสร้างขึ้นเพื่อแปลงfalseค่าเป็น String เนื่องจากการแสดงสตริงของอาร์เรย์ว่างเป็นเพียงสตริงว่างนั้นเทียบเท่ากับ:
false+[]; // "false"
false+''; // "false"
ส่วนสุดท้ายคู่ของวงเล็บเหลี่ยมหลังวงเล็บเป็นตัวเข้าถึงคุณสมบัติและรับนิพจน์ซึ่งสร้างขึ้นโดยตัวดำเนินการ Unary Plus ที่ใช้กับอาร์เรย์ว่างอีกครั้ง
สิ่งที่ตัวดำเนินการ Unary Plus ทำคือการแปลงประเภทเป็นNumber:
typeof +"20"; // "number"
อีกครั้งหนึ่งสิ่งนี้ถูกนำไปใช้กับ Array ที่ว่างเปล่าและอย่างที่ฉันเคยพูดไปก่อนหน้านี้การแสดงสตริงของ Array เป็นสตริงว่างและเมื่อคุณแปลงสตริงว่างเป็น Number จะถูกแปลงเป็นศูนย์:
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
ดังนั้นเราจึงสามารถ "ถอดรหัส" นิพจน์ได้ในบางขั้นตอน:
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
โปรดทราบว่าการเข้าถึงอักขระโดยใช้เครื่องหมายวงเล็บบนค่าสตริงไม่ได้เป็นส่วนหนึ่งของ ECMAScript 3rd Edition Specification (นั่นคือสาเหตุที่charAtมีวิธีการนี้)
อย่างไรก็ตาม "คุณสมบัติดัชนี" ประเภทนี้ที่แสดงถึงอักขระของสตริงได้รับการกำหนดมาตรฐานบน ECMAScript 5 และก่อนที่จะมีการกำหนดมาตรฐานคุณลักษณะนี้ก็มีให้ใช้งานในเบราว์เซอร์จำนวนมาก (แม้ใน IE8 (โหมดมาตรฐาน))