2009-10-26 11 views
8

JSLint इसरैपिंग छोरों में यदि जावास्क्रिप्ट में बयान के साथ के लिए - सरणियों से अधिक पाशन

var myArray = [1, 2, 3]; 
for (var value in myArray) 
{ 
    // BLAH 
} 

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

इसके अतिरिक्त जब मैं की तरह

for (var i = 0; i < 10; i++) 
{ 
    // foo 
} 

for (var i =0; i < 20; i++) 
{ 
    // bar 
} 

कुछ करना यह शिकायत है कि मैं पहले से ही परिभाषित किया गया है। अलग-अलग चर नामों का उपयोग करने से मैं इसे कैसे रोकूं?

उत्तर

9

जेएसलिंट बहुत कुछ हानिकारक नहीं है जो बहुत हानिकारक है। इस मामले में for...in के बारे में शिकायत करने का अधिकार है, क्योंकि यह एक ऐरे पर लूप के लिए गलत निर्माण है।

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

जबकि आप उस मामले को hasOwnProperty के साथ पराजित कर सकते हैं, यह जांचने के लिए कि यह प्रोटोटाइप सदस्य नहीं है, यह for (var i= 0...) के साथ उचित तरीके से करने के बजाय यह परेशान है, इसलिए परेशान क्यों करें।

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

यह शिकायत करता है कि मुझे पहले ही परिभाषित किया गया है। अलग-अलग चर नामों का उपयोग करने से मैं इसे कैसे रोकूं?

हाँ, आप इसे अनदेखा कर सकते हैं।

यह चाहता है कि आप दूसरे for (i... से var को हटा दें, क्योंकि एक ही दायरे में दो बार एक चर घोषित करने से कुछ भी नहीं होता है। हालांकि मैं var को छोड़ने की अनुशंसा करता हूं क्योंकि यह कोई नुकसान नहीं करता है, और यदि आप लूप को किसी अन्य ब्लॉक पर ले जाते हैं तो आप नहीं चाहते हैं कि यह अचानक ग्लोबल्स पर लिपटे हो।

8

वास्तव में, आपको jslint को सुनने की आवश्यकता नहीं है। लेकिन तुम क्या अगर आप वास्तव में सिर्फ पारित करने के लिए (जो अच्छा है) चाहते हो सकता है:

var myArray = [1, 2, 3]; 
for (var value in myArray) 
{ 
    if (myArray.hasOwnProperty(value)) { 
    // BLAH 
    } 
} 

दूसरे भाग के लिए, आप या तो उन्हें कार्यों में डाल या विभिन्न चर का उपयोग करना पड़ता है। दूसरा समाधान के बजाय i का उपयोग करना होगा क्योंकि यह पहले से ही परिभाषित है ...

4

यदि आप जेएसलिंट दस्तावेज़ देखते हैं तो आपको the rationale behind filtering for-in loops समझाते हुए एक लिंक मिलेगा: मूल रूप से, यह ऑब्जेक्ट के प्रोटोटाइप में जोड़े गए किसी भी समेकित गुणों पर ट्राइपिंग से बचने के लिए है। (हालांकि आपको किसी भी सरणी पर फिर से उपयोग करने के लिए उपयोग नहीं करना चाहिए।)

दूसरे मामले में आप चर दो बार घोषित कर रहे हैं: चर के पास जावास्क्रिप्ट में कार्यक्षेत्र (या वैश्विक दायरा) कार्य करता है।डगलस Crockford, और इसलिए JSLint का तर्क है कि यह केवल एक बार गुंजाइश जिसमें यह रहता है के लिए चर घोषित करने के लिए बेहतर है:

var i; 

for (i = 0; i < 10; i++) 
{ 
    // foo 
} 

for (i =0; i < 20; i++) 
{ 
    // bar 
} 
0

मैं अच्छा संदर्भ बिंदु के रूप JSLint का पालन करने का सुझाव देते हैं, तो आप कुछ विकल्पों को कॉन्फ़िगर कर सकते हैं और आपको ढीला जांचने के लिए।

वैसे भी किसी सरणी के माध्यम से पुनरावृति करने के लिए सबसे अच्छा तरीका है पाश में के लिए के लिए पाश के बजाय उपयोग कर रहा है।

यदि आप एक विस्तृत स्पष्टीकरण चाहते हैं तो यह post

पढ़ें
संबंधित मुद्दे