2016-02-18 7 views
5

मैं आयनिक फ्रेमवर्क में लिस्टिंग उद्देश्यों के लिए एक सरणी बनाने की कोशिश कर रहा हूं और उन्हें सभी वर्णमाला नाम के पहले चार को वर्णमाला सरणी में जोड़ने के लिए जांच कर रहा हूं।सूची मैनिपुलेशन अनंत लूप की ओर जाता है

for (var i = 0; i < callcenterList.length; i++) { 
    var value = callcenterList[i]._owner && callcenterList[i]._owner.company.name[0]; 

    if ((alphabet.indexOf(value) == -1 && isNaN(parseInt(value))) || 
     (isNaN(alphabet[0]) && !isNaN(value))) { 
     if(!isNaN(value)) 
     value = 123; 

     alphabet.push(value); 

     callcenterList.splice(i, 0, { 
     divider: { 
      alphabet: value 
     } 
     }); 
    } 
    }; 

value = '#' साथ value = 123 की जगह गूगल क्रोम और गूगल क्रोम कैनरी खराब और तुरंत मैक में राम की 100% तक उपयोग करने के लिए कारण बनता है।

क्या यह जावास्क्रिप्ट बग है या यह Google क्रोम से संबंधित है?

+0

इससे पहले कभी नहीं सुना ... – durbnpoisn

+0

यदि आप सिंगल के बजाय डबल कोट्स का उपयोग करते हैं तो इससे कोई फर्क पड़ता है? –

+1

ठीक है, अगर यह # है, तो यह वर्णमाला का हिस्सा नहीं है, और यह संख्या नहीं है, और चूंकि आप अपने लूप को callcenterList.length (और लूप के अंदर धक्का) के आधार पर सीमित करते हैं, मुझे नहीं लगता कि इसे या तो करना है # और न तो क्रोम के साथ? :) – Icepickle

उत्तर

6

यह आपके ब्राउज़र या किसी भी चीज़ में कोई बग नहीं है: आप केवल एक ऐसी स्थिति बना रहे हैं जहां आपका कोड एक अनंत लूप में जाता है, जो हमेशा ब्राउज़र को जब्त कर लेता है। आप एक ही चीज़ को सरल while (true) {} लूप के साथ कर सकते हैं।

विशेष रूप से, आप callcenterList पर और फिर भी isNaN(alphabet[0]) पर फिर से चल रहे हैं, आप callcenterList में एक नया तत्व विभाजित कर रहे हैं। alphabet[0] में पहला मूल्य होगा जो आप वहां दबाएंगे, जिस सशर्त में आप देख रहे हैं, आप '#' पर सेट करने जा रहे हैं।

इसलिए, isNaN(alphabet[0]) हमेशा सत्य होगा।

इसलिए, आप callcenterList में मान जोड़ना जारी रखेंगे।

इसलिए i < callcenterList.length हमेशा सत्य होगा।

+0

यह लूप के लिए एक आसान है। और ऐसी कोई शर्त नहीं है जो अनंत लूप बना सके। यहां तक ​​कि अगर "अगर" स्थिति गलत प्रतीत होती है, तो लूप को फिर से जारी रखना जारी रखना चाहिए। मैं इस स्थिति में क्या गलत कर रहा हूं? – Yagiz

+1

@Yagiz आप लूप के अंदर 'splice' के साथ पुनरावृत्त सरणी में एक तत्व जोड़ रहे हैं। चूंकि यह हर बार किया जाता है, 'मैं कभी भी सरणी की लंबाई तक नहीं पहुंचूंगा। –

+0

@Yagiz: मैंने अपने उत्तर में एक और विस्तृत स्पष्टीकरण जोड़ा। असल में, क्या E_net4 ने कहा: आप प्रत्येक सरणी के साथ अपनी सरणी की लंबाई बढ़ा रहे हैं, ताकि आप कभी भी इसके अंत तक नहीं पहुंच सकें। – StriplingWarrior

1

चूंकि यह विश्वास है कि लंबाई फिर से मूल्यांकन किया जा रहा है मुश्किल है, यहाँ क्या समस्याओं का एक सरल उदाहरण आप

मिल सकता है ब्रेक बयान के बिना है, कोड एक अंतहीन लूप में चलेगा। (कितनी देर सूची हो सकता है के लिए कंसोल लॉग की जाँच करें)

var list = [0,1,2,3]; 
 

 
for (var i = 0; i < list.length; i++) { 
 
    list.push(i); 
 
    if (i > 1000) { 
 
    break; 
 
    } 
 
} 
 

 
console.log(list.length);

आपका कोड करता है ठीक उसी, सिवाय इसके कि आपके जोड़ समारोह अपनी सूची के विशिष्ट स्थिति में नए तत्व जोड़ देगा (nl, आपकी अनुक्रमणिका)। अंत में, यह अभी भी लंबाई बढ़ाएगा, और आपकी सूची एक और होगी

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