जैसा कि @ मौरिसियो ने टिप्पणी की है (![]+[])[+[]]कि "एफ" ("गलत" का पहला चार्ट है), (![]+[])[+!+[]])"ए", आदि है ...
यह कैसे काम करता है?
आइए पहले वर्ण की जाँच करें, 'f':
(![]+[])[+[]]; // 'f'
कोष्ठक के बीच अभिव्यक्ति का पहला भाग — द्वारा बनाया गया है ![]+[], एडिशन ऑपरेटर का पहला ऑपरेंड है ![]और यह उत्पादन करेगा false, क्योंकि एक ऐरे ऑब्जेक्ट- जैसा कि किसी अन्य ऑब्जेक्ट का उदाहरण — सत्य है , और लॉजिकल (!) को लागू करना एकात्मक नहीं है। ऑपरेटर, यह falseउदाहरण के लिए मूल्य पैदा करता है ।
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
इसके बाद, हमारे पास जोड़ का दूसरा ऑपरेंड है, एक खाली ऐरे,, []यह सिर्फ falseस्ट्रिंग को मान बदलने के लिए बनाया गया है , क्योंकि एक खाली सरणी का स्ट्रिंग प्रतिनिधित्व सिर्फ एक खाली स्ट्रिंग है, इसके बराबर है:
false+[]; // "false"
false+''; // "false"
अंतिम भाग, कोष्ठक के बाद वर्ग कोष्ठक की जोड़ी, वे संपत्ति अभिगमकर्ता हैं, और वे एक अभिव्यक्ति प्राप्त करते हैं, जो एक खाली सरणी पर फिर से लागू यूनीरी प्लस ऑपरेटर द्वारा बनाई गई है।
Numberउदाहरण के लिए , यूनिरी प्लस ऑपरेटर क्या प्रकार रूपांतरण करता है :
typeof +"20"; // "number"
एक बार, यह एक खाली एरे पर लागू होता है, और जैसा कि मैंने पहले कहा था, स्ट्रिंग का प्रतिनिधित्व एक खाली स्ट्रिंग है, और जब आप एक खाली स्ट्रिंग को संख्या में परिवर्तित करते हैं, तो इसे शून्य में बदल दिया जाता है:
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
इसलिए हम कुछ चरणों में अभिव्यक्ति को "डिकोड" कर सकते हैं:
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
ध्यान दें कि स्ट्रिंग मानों पर ब्रैकेट नोटेशन का उपयोग करके वर्णों तक पहुंचना ECMAScript 3 का हिस्सा नहीं था। संस्करण की विशिष्टता, (इसीलिए यह charAtविधि अस्तित्व में है)।
हालांकि इस तरह के "इंडेक्स प्रॉपर्टीज" जो एक स्ट्रिंग के वर्णों का प्रतिनिधित्व करते हैं, उन्हें ECMAScript 5 पर मानकीकृत किया गया था, और मानकीकरण से पहले भी यह फीचर अच्छी संख्या में ब्राउज़रों में उपलब्ध था (यहां तक कि IE8 (मानकों मोड) में)।