अनपेक्षित पर जावास्क्रिप्ट संभव परिवर्तन


88

मेरे पास निम्नलिखित कोड हैं:

  for (i in awards) {
         if (awards[i] instanceof Array === false) {
               console.log(awards[i]);
                httpFactory.patch(awards[i], {"read": true}, false);
             }
       }

मेरा आईडीई इस त्रुटि को उपरोक्त कोड से संबंधित दिखाता है:

अनपेक्षित (कस्टम / विरासत में) सदस्यों पर संभावित पुनरावृत्ति, संभवतया hasOnProperty चेक गुम है

जावास्क्रिप्ट में अनफिल्टर्ड इन-लूप के किसी भी उदाहरण के लिए चेक। इस निर्माण के उपयोग के परिणामस्वरूप विरासत में मिली या अप्रत्याशित गुण हैं। आपको hasOwnProperty () विधि के साथ अपने गुणों को फ़िल्टर करने की आवश्यकता है। सत्यापन जावास्क्रिप्ट, एचटीएमएल या जेएसपी फाइलों में काम करता है।

क्या आप इस विवरण से और अधिक विस्तार से बता सकते हैं?


2
jQuery hasOwnPropertyचेक नहीं करता है - मुझे आश्चर्य है कि कितने चेतावनी का उत्पादन होगा ....
— Alnitak

जवाबों:


151

IDE अनुशंसा कर रहा है कि आप एक परीक्षण जोड़ें:

if (awards.hasOwnProperty(i)) {
    ...
}

के अंदर forलूप के ।

मैं व्यक्तिगत रूप से ऐसा नहीं करने की सलाह देता हूं, और यदि संभव हो तो चेतावनी को अक्षम करता है। अधिकांश कोड की कोई आवश्यकता नहीं है, और यहां तक ​​कि ईएस 5 कोड में भी कम आवश्यकता है जहां आप सुरक्षित रूप से किसी वस्तु का उपयोग करने के लिए गैर-एन्यूमरेबल गुण जोड़ सकते हैंObject.defineProperty

hasOwnPropertyजांच केवल आवश्यक है जब आप unsafely करने के लिए नए (गणनीय) गुण को शामिल किया है Object.prototype, तो सबसे आसान ठीक है ऐसा नहीं करते हैं कि ।

jQuery इस परीक्षण को निष्पादित नहीं करता है - वे स्पष्ट रूप से दस्तावेज़Object.prototype में लिखते हैं कि jQuery टूट जाएगा यदि बिना शर्त संशोधित किया गया हो।


44
IntelliJ 15 में, चेतावनी को अक्षम करने के लिए, निम्नलिखित कार्य करें: प्राथमिकताएँ खोलें -> संपादक -> कोड शैली -> निरीक्षण। खोज बॉक्स में, "hasOwnProperty" दर्ज करें। यह "अनफ़िल्टर्ड for..in लूप" प्रदर्शित करेगा। उस बॉक्स को अनचेक करें। परिवर्तन को स्वीकार करने और विंडो को बंद करने के लिए ओके बटन पर क्लिक करें।
— मच्युन

2
IntelliJ में: CTRL ALT S (जब तक आप उबंटू का उपयोग नहीं करते हैं जिसका अपना CTRL ALT S शॉर्टकट है) बस "hasOwnProperty" की खोज करें और आप सीधे समस्या पर पहुंच जाएंगे, इसे अनचेक करें और यह हो गया!
— ओलिवियर पोंस

2
वेबस्टॉर्म में, फ़ाइल ... सेटिंग्स, फिर संपादक -> निरीक्षण -> "जावास्क्रिप्ट और टाइपस्क्रिप्ट" -> सामान्य पर जाएं, और "अनफिल्टर्ड फॉर.इन लूप" को अनचेक करें।
— 2012

@Machtyn इस चेतावनी को अक्षम करने के लिए सेटिंग्स में जाने की आवश्यकता नहीं है। लिनक्स / विंडोज पर, चेतावनी पर कर्सर के साथ Alt + Enter दबाएं, संदर्भ मेनू पर पहला विकल्प चुनें जो पॉपअप करता है और पहले विकल्प के बगल में सबमेनू में सेटिंग को अक्षम करता है।
— पीटरचूला

22

जावास्क्रिप्ट में हर वस्तु का प्रोटोटाइप होता है जिसके अपने गुण (मूल / विरासत में मिली विधियाँ / गुण) होते हैं और गुण जो सीधे वस्तु से ही जुड़े होते हैं।

जब आप किसी वस्तु पर पुनरावृत्ति करते हैं, तो वह वस्तु के गुणों और वस्तु के प्रोटोटाइप के गुणों को पुन: व्यवस्थित करेगा।

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

उदाहरण

for (var k in object) {
  if (object.hasOwnProperty(k)) {
     // do your computation here.
  }
}

अधिक विवरण यहां पाया जा सकता है



3

इसके अलावा, आप एक अधिक पठनीय और कार्यात्मक दृष्टिकोण के लिए एक फॉरेस्ट लूप लिखने की चेतावनी से छुटकारा पा सकते हैं:

Object.keys(object).forEach(key => {
    // Do something with object[key]
});

-3

आपको इस लूप की शुरुआत में एक और शर्त जोड़ना चाहिए

if (awards.hasOwnProperty(i)) 

15
मैंने इस जवाब को वोट दिया, इसलिए मुझे लगता है कि अगर मैं कहता हूं तो यह विनम्र है। यह उत्तर कहता है कि चेतावनी से कैसे बचें लेकिन यह नहीं समझाता है कि चेतावनी का अर्थ क्या है, यह कैसे बचता है, या यह कोड क्या करता है।
— वुडन किटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.