2015-09-03 9 views
7

एक पुस्तक में मैं पढ़ रहा हूँ कि (जावास्क्रिप्ट & JQuery - इंटरएक्टिव फ़्रंट एंड जॉन Duckett द्वारा विकास) वहाँ एक दिलचस्प त्रुटि है या (कम से कम मुझे ऐसा लगता है), जो काम करने से कोड नहीं रुकती:var i = [0] लूप के लिए, फिर i ++ में वृद्धि हुई - यह क्यों काम करती है?

for (var i = [0]; i < options.length; i++) {   
    addEvent(options[i], 'click', radioChanged);  
} 

यह स्क्रिप्ट का एक हिस्सा है जो किसी भी रूप में सभी रेडियो बटनों के माध्यम से लूप करता है और एक ईवेंट श्रोता को जोड़ता है (इससे कोई फर्क नहीं पड़ता कि यह क्या करता है)।

लेकिन ...

  1. क्यों मैं बिल्कुल एक सरणी के रूप में initialised है?

  2. वृद्धि वृद्धि क्यों करती है?

  3. पूरे लूप क्यों काम करते हैं?

बेशक यदि आप var i = 0 0 को var i = 0 के साथ बदलते हैं तो कोड अभी भी काम करता है।

जब आप लूप के प्रत्येक पुनरावृत्ति और i के प्रकार में i के मान को देखने के लिए कुछ अलर्ट जोड़ते हैं, तो दूसरे पुनरावृत्ति प्रकार पर मैं ऑब्जेक्ट से बदलता हूं (पहले पुनरावृत्ति में यह सब एक सरणी है) नंबर। यह एक प्रकार का निहित प्रकार रूपांतरण है जिसे मैंने अब तक कभी नहीं देखा है (और Google बहुत मदद नहीं करता है)। क्या कोई समझ सकता है कि हुड के नीचे क्या चल रहा है?

for (var i = [0]; i < options.length; i++) {   
    addEvent(options[i], 'click', radioChanged); 
    alert(i); // --> 1 2 3 ... 
    alert(type of i); // --> object number number ... 
} 

उत्तर

8

कल्पना says (§ 11.3.1) कि ++ ऑपरेटर एक नंबर करने के लिए अपने संकार्य धर्मान्तरित बढ़ाने से पहले:

  1. चलो OLDVALUEToNumber (GetValue (एलएचएस हो))।

जब एक वस्तु पर कहा जाता है, GetValue आंतरिक आपरेशन toString() है, जो, एक सरणी के लिए, उसके तत्वों में शामिल हो जाएगा, लौटने '0' कॉल करेंगे।

+0

ठीक है, धन्यवाद :) तो मुझे लगता है कि यह एक छोटी सी बग है लेकिन एक 'त्रुटि' नहीं है ... – Tadek

+0

@Tadek: यह एक भ्रमित विशेषता है। कल्पना यह कहती है कि '' 1 '' की वृद्धि के परिणामस्वरूप '11 'के बजाय' 2' होगा। – SLaks

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