2012-10-26 24 views
6

IE8 में कुछ Javascrpt कोड का परीक्षण मैं कुछ अजीब व्यवहार का सामना कर रहा हूँ जब एक साधारण for..in पाश करते समय:क्यों के लिए ... समारोह के नाम के माध्यम से लूप पुनरावृति में

var categories = ['for', 'bar', 'steam']; 
for(var key in categories) { 
    console.log(key); 
} 

आउटपुट:

0 
1 
2 
forEach 
map 
filter 
reduce 
indexOf 
end 

जिसमें ऐरे प्रोटोटाइप फ़ंक्शन शामिल हैं, है ना? निश्चित रूप से यह काम नहीं करना चाहिए। ऐसा क्यों है?

बीटीडब्ल्यू, यह लूप को for (var key=0; key < categories.length, key++) पर बदलते समय निश्चित रूप से काम करता है।

+4

'के लिए ... in' अंकन वस्तुओं के गुणों पर पुनरावृत्त करने के लिए बनाया जाता है। एमडीएन पर दूसरी चेतावनी देखें: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in – Blender

+0

सभी को इतनी तेज़ी से जवाब देने और समस्या को हल करने के लिए धन्यवाद! – quape

उत्तर

2

ऐसा इसलिए है क्योंकि आप शायद ऐसी लाइब्रेरी का उपयोग कर रहे हैं जो Array.prototype तक फैली हुई है। अन्य ब्राउज़रों में ऐसा नहीं होने का कारण यह है कि वे पहले से ही उन तरीकों का समर्थन करते हैं। चूंकि आईई इसका समर्थन नहीं करता है, इसलिए कुछ कोड है जो इसे जेएस में जोड़ता है, जो विधियों को समेकित बनाता है।

यही कारण है कि आपको for in का उपयोग सरणी के साथ क्यों नहीं करना चाहिए।

दूसरा यह तथ्य है कि for in पुनरावृत्ति के क्रम की गारंटी नहीं देता है, और हालांकि यह अधिकांश ब्राउज़रों में काम करता है, यह स्पष्ट रूप से विनिर्देश द्वारा अपरिभाषित व्यवहार के रूप में छोड़ा गया है। जॉन Resig खुद क्रोम http://code.google.com/p/chromium/issues/detail?id=883 के विरुद्ध कोई बग दायर किया था और इसे बंद कर दिया गया था के रूप में ठीक नहीं होगा, कोई आवश्यकता नहीं है कि गुण एक मानक पाश का उपयोग करने के

स्टिक आदेश दिया जा करने की जरूरत है वहाँ के बाद से

+0

"और हालांकि यह काम नहीं करता" के साथ आपका क्या मतलब है? यह काम करता है लेकिन, जैसा कि आपने वर्णन किया है, यह अनियमित गुणों को दर्शाता है। साथ ही मुझे नहीं लगता कि वहां "विधियों को समझा जा सकता है", आपके सरणी में जोड़े गए सभी विधियां डिफ़ॉल्ट रूप से गणना योग्य हैं। – Nappy

+0

@Nappy, मैं यह नहीं बता सकता कि आप क्या कह रहे हैं। मैंने कहा कि ज्यादातर ब्राउज़रों में, यह काम करता है (सही क्रम में पुनरावृत्त)। यदि आप अपने आप को गुण जोड़ते हैं, तो वे संख्यात्मक होंगे, लेकिन मूल विधियां –

+0

आह नहीं हैं, क्षमा करें, यह एक भाषा मुद्दा था, आप वास्तव में sth मतलब था। जैसे "और यह है कि यह अधिकांश ब्राउज़रों में कैसे काम करता है"। हालांकि आपका उपयोग मुझे भ्रमित कर रहा है :) – Nappy

2

for..in वस्तुओं सरणी के लिए है। एक नियमित रूप से for पाश का उपयोग करें:

for (var i = 0; i < categories.length; i++) { 
    console.log(categories[i]); 
} 

for...in सरणियों के लिए काम करेगा जब तुम सूचकांक के बारे में परवाह नहीं है, लेकिन यह उचित नहीं है। आप जिस समस्या का सामना कर रहे हैं वह है क्योंकि for...inसभी प्रोटोटाइप में ऑब्जेक्ट के गुणों को देखता है, यही कारण है कि यह हमेशा यह जांचने की अनुशंसा की जाती है कि संपत्ति वास्तव में वस्तु में है या नहीं।

for (var i in obj) { 
    if (obj.hasOwnProperty(i)) { 
     // do something 
    } 
} 
+0

यदि आप विरासत गुणों को देखना नहीं चाहते हैं, तो कभी-कभी आप इसकी अनुशंसा करते हैं। –

0

ऐसा लगता है कि आप कुछ ढांचे का उपयोग कर रहे हैं। सरणी को फिर से चलाने का यह बुरा तरीका है, क्योंकि कुछ ढांचे प्रोटोटाइप को स्टैंडअर्ट करने के लिए कार्यक्षमता जोड़ते हैं।

for (var i=0, len=arr.length; i<len; ++i) { 

} 

वह कोड कहीं भी काम करेगा।

+0

'for..in' जेएस 1 (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in) के बाद जेएस स्पेक का हिस्सा है –

+0

मुझे पता है। लेकिन "इन इन" सरणी पुनरावृत्ति का उपयोग केवल तभी किया जा सकता है जब आप गारंटी दे सकें कि कोई भी Array.prototype को नहीं बदलेगा। मुझे लगता है कि यह सुरक्षित नहीं है। – Damask