2015-05-30 8 views

उत्तर

8

!! एक बूलियन में true या false में परिवर्तित करने का एक तरीका है। true के लिए एक संख्यात्मक प्रतिनिधित्व 1 है और झूठी के लिए यह 0 है। उदाहरण के लिए:

!![] => true => 1

जब आप एक नंबर करने के +[] कन्वर्ट यह (जब एक बूलियन यह बात गलत है करने के लिए परिवर्तित) 0 को जाता है, तो !+[]true है। अब देता है उन वस्तुओं कन्वर्ट:

var sum = +((!+[] + !![] + !![] + []) + (!+[] + !![] + !![] + !![] + !![] + !![])); 

var sum = +((true + true + true + []) + (true + true + true + true + true + true)); 

var sum = +((3 + []) + (6)); 

अब ध्यान दें (3 + []) => "3", एक स्ट्रिंग के लिए evals। फिर स्ट्रिंग संख्या 6 साथ concatenated है:

var sum = +("3" + 6); // "36" 

फिर अंत में +("36") एक संख्या में स्ट्रिंग बदल जाता है:

var sum = 36; 
2

तीन प्रमुख बातें इस विशिष्ट उदाहरण में undertand करने के लिए कर रहे हैं:

  1. क्या प्रकृति और एकल + ऑपरेटर
  2. के व्यवहार क्या प्रकृति और तार्किक नहीं ऑपरेटर के व्यवहार है
  3. उपर्युक्त ऑपरेटर खाली सरणी के साथ कैसे बातचीत करते हैं

unary + operator अपने ऑपरेंड (उसके दाहिनी ओर मान) को किसी संख्या में परिवर्तित करता है। logical NOT operator या तो अपने ऑपरेंड को बूलियन में परिवर्तित करता है, या फ्लिप मूल्य यदि ऑपरेंड पहले से ही एक बूलियन है।

कुछ भी करने से पहले ऑपरेटर के शुरुआती get the value दोनों ऑपरेटर। तो जब ऑपरेंड एक सरणी है, तो हमें यह समझने की आवश्यकता है कि सरणी के मान क्या है।

कैसे इन ऑपरेटरों एक सरणी के साथ व्यवहार करते हैं पता लगाने के लिए पहले कुछ बातें की कोशिश की सुविधा देता है:

+[]; // 0 
![]; // false 

+ ऑपरेटर अपनी संकार्य के मूल्य में हो जाता है, और फिर रूपांतरित कि एक नंबर करने के लिए। ! ऑपरेटर को अपने ऑपरेंड का मूल्य मिलता है, और फिर उसे एक बूलियन में परिवर्तित करता है।

क्या हम ! ऑपरेटर दो बार उपयोग करने के लिए, और कि परिणामस्वरूप मूल्य पर + ऑपरेटर का उपयोग कर रहे थे तो क्या होगा?

!![]; // true 
+!![]; // 1 

अब हम दोनों संख्या 0, और संख्या 1. इस शक्ति को देखते हुए बनाने की क्षमता को देख रहे हैं, हम कुछ गणित (ध्यान दें कि मैं स्पष्टता के लिए समूह ऑपरेटर का उपयोग कर रहा करने के लिए शुरू कर सकते हैं:

(+!![]) + (+!![]) 

यह 1 + 1 में परिणाम है, 2. इन पर्याप्त तरह प्रदर्शन संचालन के बराबर 36 प्राप्त करने के लिए काफी अव्यवस्था का एक सा की आवश्यकता होगी, लेकिन उदाहरण से ऊपर कुछ कटौती के रूप में Addition Operator लाभ उठाता है।

अतिरिक्त ऑपरेटर स्ट्रिंग कॉन्सटेनेशन, साथ ही साथ संख्यात्मक जोड़ करता है। तो "foo"+"bar""foobar" देता है। इसी प्रकार, स्ट्रिंग-फॉर्म में संख्याओं को जोड़ा जाएगा, इसके बजाय जोड़ा गया: "3"+"6""36" देता है।सवाल में प्रदान किए गए कोड सरणियों के निहित व्यवहार का लाभ उठाकर स्ट्रिंग रूपांतरण के लिए संख्या को प्राप्त होता है:

["Hello"].toString(); // "Hello" 
[].toString(); // "" 
अलावा ऑपरेटर के साथ

, अगर संकार्य के किसी भी पक्ष एक स्ट्रिंग है, परिणाम भी एक स्ट्रिंग होगा (देखें 11.6.1 का चरण 7)। क्योंकि सरणी की .toString विधि कहा जाता है, सरणी एक खाली स्ट्रिंग उत्पन्न करती है।

7 + ""; // "7" 

यह श्रेणीबद्ध करने के बजाय जोड़ने के लिए, दो नंबर का उपयोग किया जा सकता है: जब इस स्ट्रिंग है संख्या का एक प्रकार है, के कि संख्या परिणाम एक स्ट्रिंग के लिए गयी। निम्न उदाहरण में, मैं हमारे पिछले कोड कि 2 में हुई अपनाया है, और स्पष्टता के लिए कुछ और समूहीकरण ऑपरेटरों कहा: मध्यम + ऑपरेटर हम नंबर एक उत्पन्न के बाईं ओर

((+!![]) + []) + ((+!![]) + []) // "11" 

, और इसे खाली सरणी द्वारा उत्पादित स्ट्रिंग में जोड़ें। इसके बाद हम मध्य + ऑपरेटर के दायीं तरफ के मूल्य पर वही काम करते हैं। परिणाम, मूल्य "1" के साथ दो तार। मध्य ऑपरेटर फिर इन दो तारों को जोड़ता है, जो "11" प्रदान करता है।

इस ज्ञान को देखते हुए, आपको अपने प्रश्न में कोड की समीक्षा करने में सक्षम होना चाहिए, और जल्दी से अलग-अलग हिस्सों को समझना चाहिए।

संबंधित मुद्दे