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




हिंदी वीडियो (6)

मैंने यह जानने के लिए घंटों का समय बिताया कि मैं शब्द को .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]);
}


Answers

क्योंकि जब आप ऐसी संपत्ति प्राप्त करने की कोशिश करते हैं जो अस्तित्व में नहीं होती है, तो वह undefined , और 0 < undefined false

let arr = [1, 2, 3, 4];
console.log(arr.lenght) // undefined
console.log(arr.qwerty) // undefined
console.log(arr.lenght < 9999) // false
console.log(arr.lenght > 9999) // false

arr.length = 7 // <-- it's not a good idea
for(let i = 0; i < arr.length; i++) {console.log(arr[i])}

संपादित करें

मैंने कहा 'जावास्क्रिप्ट एक दृढ़ता से टाइप की गई भाषा नहीं है' और यह सच है। लेकिन नए गुणों को जोड़ने का यह तरीका प्रोटोटाइप आधारित प्रोग्रामिंग की एक विशेषता है, जैसा @Voo ने कहा।

मैंने भी कहा .length=7 यह एक बुरा विचार है। थोड़ा और पढ़ने के बाद, इस मामले में मुझे अभी भी लगता है कि तत्वों को जोड़ने के बाद length संपत्ति में वृद्धि करना थोड़ा अजीब है। हो सकता है कि यह ठीक हो, तत्वों को हटाने या किसी सरणी को खाली करने के लिए ठीक है, हालांकि बाद के मामले में मैं arr.length=0 करना पसंद करूंगा।

मोज़िला प्रलेखन में length संपत्ति के बारे में कुछ दिलचस्प उदाहरण हैं।

एक जावास्क्रिप्ट सरणी की लंबाई की संपत्ति और संख्यात्मक गुण जुड़े हुए हैं। अंतर्निहित सरणी विधियों में से कई (जैसे, सम्मिलित हों (), स्लाइस (), इंडेक्सऑफ (), आदि) एक सरणी की लंबाई संपत्ति के मूल्य को ध्यान में रखते हैं जब उन्हें बुलाया जाता है। अन्य विधियाँ (जैसे, धक्का (), ब्याह) (), इत्यादि भी एक सरणी की लम्बाई की संपत्ति के अद्यतन के परिणामस्वरूप हैं।

var fruits = [];
fruits.push('banana', 'apple', 'peach');
console.log(fruits.length); // 3

जब संपत्ति एक वैध सरणी इंडेक्स है तो जावास्क्रिप्ट एरे पर संपत्ति सेट करना और यह इंडेक्स सरणी के वर्तमान सीमा के बाहर है, इंजन सरणी की लंबाई की संपत्ति को तदनुसार अपडेट करेगा:

fruits[5] = 'mango';
console.log(fruits[5]); // 'mango'
console.log(Object.keys(fruits));  // ['0', '1', '2', '5']
console.log(fruits.length); // 6

लंबाई बढ़ाना।

fruits.length = 10;
console.log(Object.keys(fruits)); // ['0', '1', '2', '5']
console.log(fruits.length); // 10

लंबाई की संपत्ति में कमी, हालांकि, तत्वों को हटा देती है।

fruits.length = 2;
console.log(Object.keys(fruits)); // ['0', '1']
console.log(fruits.length); // 2

लूप के ऊपरी हिस्से को lenght रूप में निर्दिष्ट किया गया है, जो स्थानीय चर लंबाई के लिए एक टाइपो है। रनटाइम के दौरान, lenght undefined मूल्यांकन करेगा, इसलिए चेक 0 < undefined false । इसलिए लूप बॉडी को कभी निष्पादित नहीं किया जाता है।


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

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

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

Object.preventExtensions(arr);

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

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


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


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

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


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

समस्या यह थी कि जावास्क्रिप्ट सेटटाइमआउट फ़ंक्शन सेट किए गए किसी भी पुराने टाइमआउट को ओवरराइट या मारने के लिए प्रतीत नहीं होता है, लेकिन यदि आप इसे स्वयं करते हैं तो यह काम करता है! तो टाइपिंग टाइमर सेट होने पर मैंने सेटटाइमआउट से ठीक पहले एक स्पष्ट टाइमआउट कॉल जोड़ा। निचे देखो:

//setup before functions
var typingTimer;                //timer identifier
var doneTypingInterval = 5000;  //time in ms, 5 second for example

//on keyup, start the countdown
$('#myInput').on("keyup", function(){
    if (typingTimer) clearTimeout(typingTimer);                 // Clear if already set     
    typingTimer = setTimeout(doneTyping, doneTypingInterval);
});

//on keydown, clear the countdown 
$('#myInput').on("keydown", function(){
    clearTimeout(typingTimer);
});

//user is "finished typing," do something
function doneTyping () {
    //do something
}

एनबी मुझे लगता है कि मैंने इसे सोरियल ड्रीम के जवाब पर टिप्पणी के रूप में जोड़ा होगा लेकिन मैं एक नया उपयोगकर्ता हूं और पर्याप्त प्रतिष्ठा नहीं है। माफ़ कीजिये!





javascript