2012-07-16 9 views
6

हम सभी जानते हैं कि for-in-loops सरणी पर absolutely evil हैं। फिर भी, उनका उपयोग अक्सर किया जाता है और कारण त्रुटियों का पता लगाने के लिए जटिल होते हैं, खासकर जब ब्राउज़र-निर्भर होने के कारण indexOf -shims या ऐसे।क्या यह फॉर-इन लूप डिटेक्शन स्निपेट अवांछित झूठी सकारात्मक उत्पन्न करेगा?

Object.defineProperty(Array.prototype, "error", { 
    enumerable: true, 
    get: function() { 
     if (this === Array.prototype) // that looks OK 
      return undefined; 
     if (window.confirm("Somebody who coded the site you're viewing runs through an Array with a for-in-loop.\nShame on him!\n\nDo you want to raise an Error to trace the origin?")) 
      throw new SyntaxError("Array traverse with for-in-loop, touching Array.prototype's 'error' property :-)"); 
    } 
}); 

आप इसके लिए एक Greasemonkey स्क्रिप्ट के रूप में जोड़ सकते हैं:

तो, मैं इस सरल टुकड़ा जो Array.prototype (नहीं उत्पादन कोड में उपयोग के लिए) पर एक "error" संपत्ति के लिए एक गणनीय गेटर कहते कोड किया है सभी डोमेन, और आप लगभग हर साइट पर अलर्ट देखेंगे :-) उनमें से अधिकतर संदिग्ध तर्कों के साथ jQuery.extend पर कॉल के कारण होते हैं, बीटीडब्ल्यू।

मेरा प्रश्न है: किसी भी स्थितियों कि वैध ऐसे "गलत" लूप, या कुछ और गलत सकारात्मक अलर्ट के कारण वहाँ हैं?

मुझे आश्चर्य है कि यह मेरे कोड की उपयोगिता को कैसे प्रभावित करेगा।

+0

मैंने इसे कम व्यक्तिपरक बनाने के लिए आपके प्रश्न को संपादित किया। मुझे आशा है कि आपको बुरा लगेगा। – hugomg

+0

धन्यवाद, मुझे वह संस्करण पसंद है - मुझे शीर्षक के रूप में उपयोग करने के लिए कोई संकेत नहीं था :-) – Bergi

+0

मुझे यह नहीं मिला है, आप इसे 'Array.prototype'' तक कैसे बढ़ाते हैं? आपको '__lookupGetter__' या कुछ का उपयोग करने की आवश्यकता होगी। अब यह केवल एक त्रुटि का कारण बन जाएगा क्योंकि विस्तारित कार्य इसे प्राप्त करेगा और त्रुटि फेंक दी जाएगी और प्रतिलिपि रोक दी जाएगी। http://jsfiddle.net/MvgJC/ – Esailija

उत्तर

0

हां। वैधता अक्सर व्यक्तिपरक हो सकता है, लेकिन ...

एक उदाहरण के रूप में, शायद मैं एक विरल सरणी है, जहां मैं डेटा के साथ अनुक्रमित पर केवल सेट मान हैं:

var a = []; 
a[123123] = "foo"; 
a[1233123] = "bar"; 

अगर मैं से अधिक पुनरावृति करना चाहता था तत्व जो मैंने इस सरणी में परिभाषित किया है, तो मैं for...in निर्माण का उपयोग करूंगा। यहां तक ​​कि अगर मैं इसे रक्षा कोडित, अपनी स्क्रिप्ट अभी भी ट्रिगर करेगा (एक झूठी सकारात्मक) ...

for (var prop in a) { 
    if (a.hasOwnProperty(prop)) { 
    // this is a legitimate array element 
    } 
} 

भी Why is using "for...in" with array iteration a bad idea? अधिक जानकारी और राय के लिए।

+2

नहीं, रक्षात्मक कोडित लूप (जो ठीक है) कभी भी 'एक [prop] 'तक पहुंच नहीं पाएगा, जहां' prop '' त्रुटि "है, इसलिए यह अपवाद नहीं उठा रहा है। – Bergi