([[] + []] [+]] ... स्पष्ट करें कि यह क्यों काम करता है


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

इस कोड के उत्पादन में है: fail। क्यों?

वैसे (![]+[])[+!+[]] == 'false'[1], सही है ?. लेकिन क्यों ![]+[] == "false"और क्यों +!+[] == 1?


14
@Snoob मुझे आप पर भरोसा नहीं है। अंत में, यह एक कांटा बम है।
जोहान्स शाउब -

3
यह एक स्ट्रिंग शाब्दिक है, निश्चित रूप से;)
यी जियांग

3
(![]+[])[+[]]"f" ("झूठा" से पहला वर्ण है), (![]+[])[+!+[]]"a", आदि है
मौरिसियो शेफ़र

3
@ साइनब: जैसा कि आपने कहा, आप अपने ब्राउज़र पर प्रत्येक अभिव्यक्ति का परीक्षण कर सकते हैं। alert(![]+[])फिर कोशिश करें alert(+!+[])और आप देखेंगे।
मौरिसियो शेफ़र

12
बेकार या नहीं, मुझे यह एक दिलचस्प सवाल लगता है और एक अच्छी तरह से शब्द स्पष्टीकरण देखना चाहेंगे। यदि उपयोगिता या व्यावहारिकता पर विचार किया गया तो कई कोड गोल्फ बंद हो जाएंगे। एक्सरसाइज और गेम्स दिमाग और सोच की प्रक्रिया का विस्तार करने के लिए खुद के लिए उपयोगी होते हैं।
जॉन के

जवाबों:


127

जैसा कि @ मौरिसियो ने टिप्पणी की है (![]+[])[+[]]कि "एफ" ("गलत" का पहला चार्ट है), (![]+[])[+!+[]])"ए", आदि है ...

यह कैसे काम करता है?

आइए पहले वर्ण की जाँच करें, '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 (मानकों मोड) में)।


46
बस उम्मीद है कि यह एक साक्षात्कार सवाल नहीं है।
आइशर

4
@JTA: मुझे आशा है कि यह है ! मैंने पास किया होगा :-D
मौरिसियो शेफ़र

18
"I" कहाँ से आता है?
जोश स्टोडोला 13:00

5
@rlemon, intभाषा पर कोई डेटा प्रकार नहीं है , वास्तव में सभी संख्याएं डबल-परिशुद्धता 64-बिट प्रारूप (IEEE 754 मान) हैं, भले ही कुछ ऑपरेटर आंतरिक मूल्यों के साथ आंतरिक रूप से काम करते हैं (जैसे बिटवाइज़ ऑपरेटरों) परिणाम हमेशा एक डबल होता है । 'i'इस उदाहरण में आता है undefined, लेकिन यह से आ सकता है Infinityउदाहरण के लिए: (+!+[]/+[+[]]+[])[!+[]+!+[]+!+[]]=> (1/0+'')[3]=> (Infinity+'')[3]=>'i'
सीएमएस

5
@JoshStodola खैर, ~ 3 महीने बाद, एक और स्पष्टीकरण। इस मामले में "मैं" "अपरिभाषित" से आता है, हां, लेकिन यहां एक और चाल शामिल है। कोड "झूठा" को "अपरिभाषित" बनाने के लिए संक्षिप्त करता है "falseundefined"(निर्माण का उपयोग करते [![]]+[][[]]हुए:) जिसमें "i" का सूचकांक 10. +!+[]+[+[]]है "10"। इसका उपयोग "i" निकालने के लिए किया जाता है (स्ट्रिंग सूचकांकों का उपयोग जावास्क्रिप्ट में किया जा सकता है अगर उन्हें पूर्णांकों के लिए जाहिरा तौर पर किया जा सकता है)। अंतिम निर्माण जो इसे बनाता है वह है:([![]]+[][[]])[+!+[]+[+[]]]
एन्ट्रापी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.