2012-06-13 24 views
5

तो मैं एक सरणी को घुमाने के बारे में पढ़ रहा था। और फिर मैं this script भर में आया था:किसी के बिना लूप के लिए {}

shuffle = function(o){ //v1.0 
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); 
    return o; 
}; 

जब मैं करीब से देखो, for भी किसी भी {} बिल्कुल नहीं है! लेकिन यह जादू की तरह काम कर रहा है। मुझे यह जानकर बहुत उत्सुकता है कि यह कैसे काम करता है। (और भी अल्पविरामों के गुच्छा।)

+0

यदि लूप के लिए केवल एक ही है तो स्क्रिप्ट काम करेगी, लेकिन यदि आपके पास एक के बाद एक से अधिक अधिकार हैं तो आपको बयान अलग करना होगा। – Rayshawn

उत्तर

10

क्या इस प्रकार for() किसी भी बयान हो सकता है; यह घुंघराले ब्रेसिज़ के साथ कुछ हो सकता है, या यह एक अभिव्यक्ति हो सकती है, या यह एक खाली अभिव्यक्ति हो सकती है। for (...);for (...) {} के बराबर है। स्वाभाविक रूप से, इसका उपयोग केवल फॉर-लूप के संयोजन के साथ किया जाना चाहिए जो स्वाभाविक रूप से समाप्त हो जाएगा, या आपके हाथों पर एक अनंत लूप होगा।

अल्पविराम प्रभावी ढंग से द्वितीय श्रेणी अर्धविराम होते हैं; वे ज्यादातर अलग-अलग बयान के लिए बनाते हैं, लेकिन जो लूप के लिए काम करेंगे (और कहीं और; यह उनकी एक बहुत ही गहरी परिभाषा है)।

for (
    // initialisation: declare three variables 
    var j, x, i = o.length; 
    // The loop check: when it gets to ``!i``, it will exit the loop 
    i; 
    // the increment clause, made of several "sub-statements" 
    j = parseInt(Math.random() * i), 
    x = o[--i], 
    o[i] = o[j], 
    o[j] = x 
) 
    ; // The body of the loop is an empty statement 

इस के रूप में एक और अधिक पठनीय रूप में रखा जा सकता है:

for (
    // initialisation: declare three variables 
    var j, x, i = o.length; 
    // The loop check: when it gets to ``!i``, it will exit the loop 
    i; 
    // note the increment clause is empty 
) { 
    j = parseInt(Math.random() * i); 
    x = o[--i]; 
    o[i] = o[j]; 
    o[j] = x; 
} 

थोड़ी देर के पाश के रूप में, कि हो सकता है:

var j, x, i = o.length; 
while (i) { 
    j = parseInt(Math.random() * i); 
    x = o[--i]; 
    o[i] = o[j]; 
    o[j] = x; 
} 
+0

'जबकि()' अधिक समझने योग्य आईएमओ है। –

+0

वास्तव में, यह इस तरह से अधिक समझ में आता है। –

1

यदि यह एक पंक्ति में सब है, कोई कोष्ठक जरूरी हैं। ब्रांड्स के अंदर उस तीसरे खंड में कई बार, आप बस i++, या ऐसा कुछ देखते हैं। वास्तव में, आप वहां कई अलग-अलग चीजें कर सकते हैं। यदि आप उस तीसरे खंड में सब कुछ पैक करने में सक्षम हैं, तो आपको for लूप के लिए शरीर की भी आवश्यकता नहीं है।

for (first section; second section; third section); 

प्रथम खंड

चर घोषित कर दिया और प्रारंभ कर रहे हैं। ये चर लूप के दायरे से निहित हैं।

दूसरा खंड

इस हालत पाश में से प्रत्येक के पास के साथ की जाँच की है।

तीसरा खंड

कोड है कि प्रत्येक के बाद चलता है पाश के माध्यम से गुजरती हैं। यह एक चर को बढ़ाने के रूप में सरल हो सकता है, और जटिल के रूप में ... अच्छी तरह से, आप लाइन पर फिट कर सकते हैं, जब तक वाक्यविन्यास सही है।

+0

असल में यह कोई लाइन नहीं है। लूप के लिए बिल्कुल कोई शरीर नहीं है। – TheHippo

1

ऐसा लगता है जैसे मैंने लूप को सही ढंग से नहीं पढ़ा।

इस मामले में, मूल्यांकन लूप की शर्तों के अंदर हो रहा है।

तो एक पाश के लिए तीन भागों

for (initial variables; end cases; what to do every iteration) 

आप, कुछ प्रारंभिक सामान को परिभाषित करने और o जो समारोह में पारित किया गया था का उपयोग समाप्त कर मामले को परिभाषित है, और फिर कुछ हर यात्रा की गणना है। अंत में, o का एक नया मूल्य है और यह वापस आ गया है।

+0

नहीं, यह नहीं है। (इस मामले में) '();' के अंत में ''; 'देखें; –

+0

क्षमा करें मैं ब्रांड्स को गलत तरीके से पढ़ता हूं। मेरा जवाब अपडेट किया गया। – sachleen

4

प्रत्येक कंप्यूटिंग एक ही कथन के लिए एक ही कथन में है जिसे हमें {} की आवश्यकता नहीं है, बल्कि इस कथन में भी; (वाक्य टर्मिनेटर का अंत में उपयोग किया जाता है) इसका मतलब है कि अगला कथन कथन के लिए नहीं है। जो भी तर्क यह बयान के लिए समान है।

for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); 


    for(var j, x, i = o.length;// Initialization 
    i;// Work until i is zero 
j = parseInt(Math.random() * i), 
    x = o[--i], o[i] = o[j], o[j] = x);//Here he is computing his logic 
0

सभी काम वास्तव में for बयान के कोष्ठक के भीतर किया जा रहा है। लूप के लिए स्पष्ट शरीर नहीं है इसलिए अंत में ; बस कहता है कि शरीर एक खाली बयान है।

, (अल्पविराम) ऑपरेटर बाएं से दाएं अभिव्यक्तियों का मूल्यांकन करता है, और दाएं-दाएं मूल्य का मूल्य देता है।

पाश मूल रूप से के बराबर है:

for(var j, x, i = o.length; i > 0;) 
{ 
    j = parseInt(Math.random() * i--); 
    x = o[i]; 
    o[i] = o[j]; 
    o[j] = x 
} 
+0

क्यों 'i> 0;'? –

+0

जब जावास्क्रिप्ट लूप स्थिति ('i') का मूल्यांकन करता है तो यह किसी गैर-शून्य मान के लिए सत्य का मूल्यांकन करता है, और जब मान 0 होता है तो गलत होता है।' I> 0' कह रहा है एक ही बात कहने का एक और स्पष्ट तरीका। लूप सरणी की लंबाई से नीचे 0 –

2

पहले, मैं ध्यान दें कि करना चाहते हैं ऐसे लूप को खराब शैली माना जाता है, क्योंकि यह बहुत पढ़ा जा सकता है और बहुत भ्रम पैदा करता है। यह अनुकूलन का एक विशिष्ट उदाहरण गलत हो गया है।

specs को देखते हुए, आप पाएंगे कि for(...) एक बयान द्वारा पालन किया जाना चाहिए। यह ब्लॉक सहित any statement हो सकता है। तो इन सब मान्य हैं:

for (...) 
    foo; // expression statement 

,

for(...) 
    { 
     // block statement 
    } 

,

for(...) 
    if(...) // If statement 
     foo; 

, और निश्चित रूप

for (...) 
    ; 

की ";" के बाद से empty statement है। यह कुछ भी नहीं करता है, लेकिन यह for(...); वाक्य रचनात्मक रूप से वैध बनाने के लिए पर्याप्त है।

अब, अल्पविराम के लिए। ध्यान दें कि पैरों की सामग्री तीन expressions, (उनमें से प्रत्येक वैकल्पिक) होना चाहिए, अर्धविराम से अलग होना चाहिए। comma-separated lists of expressions सहित बहुत अधिक "सब कुछ" अभिव्यक्ति के रूप में योग्यता प्राप्त करता है। हालांकि थोड़ा ज्ञात है, यह काम जेएस में मूल रूप से हर जगह है, न केवल for लूप में। उनका मूल्यांकन दूसरे के बाद किया जाता है।

तो, अपने पाश इतना

shuffle = function(o) { 
    var j, x, i = o.length; 
    while (i) { // for-loops are just while-loops in disguise 
     j = parseInt(Math.random() * i), // even better: replace , by ; 
     x = o[--i], 
     o[i] = o[j], 
     o[j] = x; 
    } 
    return o; 
}; 

भी तरह फिर से लिखा जा सकता है, x = o[--i]i--; x = o[i] के रूप में लिखा जाना चाहिए।

+0

'एक बयान के बाद पालन किया जाना चाहिए ... 'वास्तव में नहीं, चश्मे में:' बी। "स्टेटमेंट" का मूल्यांकन करने का परिणाम "stmt" होना चाहिए। सी। अगर stmt.value खाली नहीं है, ... 'यह जांचना है कि कुछ है या नहीं, क्योंकि "वक्तव्य" खाली हो सकता है। –

+0

"अगर कुछ है तो इसमें कोई जांच नहीं है" - ठीक है, यह कहता है * स्टेटमेंट * इटालिक्स में, इसलिए वहां एक [कथन] (http://es5.github.com/#x12) होना चाहिए, जो नहीं हो सकता "कुछ भी तो नहीं"। इसका * मूल्य * खाली हो सकता है, उदाहरण के लिए 'वापसी;' कथन लें। – user123444555621

+0

यह भ्रमित है। तो * कुछ नहीं * * कुछ भी नहीं * या * खाली स्टेटमेंट * के रूप में व्याख्या किया गया है? –

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