भजन - जब मैं लूप में arr.length की बजाय arr.lenght(misspelt) का उपयोग करता हूं तो JavaScript ने मुझे चेतावनी क्यों नहीं दी? मैं सख्त मोड का भी इस्तेमाल करता हूं




चेतावनी भजन हिंदी में (4)

मैंने केवल यह जानने के लिए घंटों का समय बिताया कि मैं शब्द को .lenght । यह सामान्य रूप से बिना किसी चेतावनी के चल सकता है। क्यूं कर...?

मैं 'use strict' उपयोग करता हूं और Node.js 10.13.0 पर चलता हूं।

कोड:

'use strict';
let arr = [1, 2, 3, 4];
for(let i = 0; i < arr.lenght; i++) {
  console.log(arr[i]);
}


क्यूं कर

मानक जावास्क्रिप्ट सरणियों वास्तव में सभी ays पर बकाया नहीं हैं, वे वस्तुएं हैं, और यदि आप एक ऐसी वस्तु संपत्ति पढ़ते हैं जो मौजूद नहीं है (जैसे कि lenght ), तो आपको undefined मान मिलता है (यहां तक ​​कि सख्त मोड में):

console.log(({}).foo); // undefined

जब आप किसी संख्या में < / > जैसे संबंधपरक ऑपरेशन में undefined का उपयोग करते हैं, तो यह एक संख्या में परिवर्तित हो जाता है, लेकिन इसे प्राप्त संख्या मान विशेषांक NaN , जिसकी तुलना में विचित्र संपत्ति हमेशा झूठी होती है:

console.log(NaN < 0);     // false
console.log(NaN > 0);     // false
console.log(NaN === 0);   // false
console.log(NaN === NaN); // false!!

आप इसके बारे में क्या कर सकते हैं

लिंटर उपकरण अक्सर इन मामलों को सरल मामलों में उठाएगा।

वैकल्पिक रूप से, टाइपस्क्रिप्ट जावास्क्रिप्ट के शीर्ष पर एक पूर्ण स्थिर टाइपिंग परत प्रदान करता है जो इस प्रकार की त्रुटियों को पकड़ सकता है।

यदि आप चाहते थे (और यह संभवतः ओवरकिल होगा), तो आप अपनी वस्तुओं के चारों ओर एक Proxy लपेट सकते हैं जिसने एक संपत्ति को पढ़ने की कोशिश की जब आप मौजूद नहीं थे एक संपत्ति पढ़ने की कोशिश की:

function proactive(obj) {
  return new Proxy(obj, {
    get(target, propName, receiver) {
      if (!Reflect.has(target, propName)) {
        throw new TypeError(`Property '${propName}' not found on object`);
      }
      return Reflect.get(target, propName, receiver);
    }
  });
}

const a = proactive(["a", "b"]);
a.push("c");
for (let i = 0; i < a.length; ++i) {
  console.log(a[i]);
}
console.log(`Length is: ${a.lenght}`); // Note the typo
.as-console-wrapper {
  max-height: 100% !important;
}

हालांकि एक महत्वपूर्ण रनटाइम पेनल्टी है।

Post (यह मेरे एनीमिक थोड़ा ब्लॉग पर एक पोस्ट है)


आप आसानी से ऑब्जेक्ट को arr करने के लिए नए गुण जोड़ सकते हैं, जावास्क्रिप्ट आपको इसके बारे में चेतावनी नहीं देगा, इसके बजाय यह उस संपत्ति को खोजने की कोशिश करेगा जिसे आप कॉल कर रहे हैं, और अगर यह कुछ भी नहीं मिला तो ऐसा परिणाम अपरिभाषित होगा, इसलिए तुलना है वास्तव में i < undefined हर समय क्योंकि आप एक ऐसी संपत्ति को बुला रहे हैं जो ऑब्जेक्ट पर नहीं बनाई गई है। मैं आपको यह पढ़ने का सुझाव दूंगा कि .com/questions/1335851/…


जावास्क्रिप्ट सरणियों को वस्तुओं के रूप में माना जाता है (हालांकि वे ऐरे के उदाहरण हैं)। इसलिए, जब आप arr.lenght , तो यह arr.lenght वस्तु को अपरिभाषित वस्तु के रूप में मानता है। इसलिए, आपको कोई त्रुटि नहीं मिलती है।

यह बस एक ऐसी संपत्ति प्राप्त करने की कोशिश करता है जो अपरिभाषित हो। इसके अलावा, आपके मामले में, लूप केवल निष्पादित नहीं करता है क्योंकि लूप की स्थिति कभी संतुष्ट नहीं होती है।


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

ऐरे अलग नहीं हैं; वे बस ऐसी वस्तुएँ हैं जो Array प्रकार की हैं (कम से कम विस्तार के उद्देश्यों के लिए)।

इस मामले में, क्या आपने जोड़ा था:

Object.preventExtensions(arr);

एरे बनाने के बाद, फिर 'use strict' यूज़ 'use strict' साथ संयोजन में यह एक त्रुटि उत्पन्न हुई होगी - क्या आपने टाइपोएड प्रॉपर्टी पर लिखने की कोशिश की थी। लेकिन इस तरह एक पढ़ने के उपयोग के लिए, अभी भी कोई त्रुटि नहीं है; तुम बस undefined हो जाओ।

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





javascript