जावास्क्रिप्ट सामान्य गलतियाँ
यह अध्याय कुछ सामान्य जावास्क्रिप्ट गलतियों की ओर इशारा करता है।
गलती से असाइनमेंट ऑपरेटर का उपयोग करना
जावास्क्रिप्ट प्रोग्राम अप्रत्याशित परिणाम उत्पन्न कर सकते हैं यदि कोई प्रोग्रामर गलती से एक असाइनमेंट ऑपरेटर ( =
) का उपयोग करता है, बजाय एक तुलना ऑपरेटर ( ==
) के एक if स्टेटमेंट में।
यह if
कथन लौटाता है false
(उम्मीद के मुताबिक) क्योंकि x 10 के बराबर नहीं है:
let x = 0;
if (x == 10)
यह if
कथन लौटाता है true
(शायद अपेक्षानुसार नहीं), क्योंकि 10 सत्य है:
let x = 0;
if (x = 10)
यह if
कथन लौटाता है false
(शायद अपेक्षित नहीं), क्योंकि 0 गलत है:
let x = 0;
if (x = 0)
एक असाइनमेंट हमेशा असाइनमेंट का मान देता है।
ढीली तुलना की उम्मीद
नियमित तुलना में, डेटा प्रकार कोई मायने नहीं रखता। यह if
कथन सत्य लौटाता है:
let x = 10;
let y = "10";
if (x == y)
सख्त तुलना में, डेटा प्रकार मायने रखता है। यह if
कथन गलत लौटाता है:
let x = 10;
let y = "10";
if (x === y)
यह भूल जाना एक सामान्य गलती है कि switch
कथन सख्त तुलना का उपयोग करते हैं:
यह case switch
एक अलर्ट प्रदर्शित करेगा:
let x = 10;
switch(x) {
case 10: alert("Hello");
}
यह case switch
अलर्ट प्रदर्शित नहीं करेगा:
let x = 10;
switch(x) {
case "10": alert("Hello");
}
भ्रमित करने वाला जोड़ और संघटन
जोड़ संख्याओं को जोड़ने के बारे में है ।
Concatenation तार जोड़ने के बारे में है ।
जावास्क्रिप्ट में दोनों ऑपरेशन एक ही +
ऑपरेटर का उपयोग करते हैं।
इस वजह से, एक संख्या को एक संख्या के रूप में जोड़ने पर एक संख्या को एक स्ट्रिंग के रूप में जोड़ने से एक अलग परिणाम प्राप्त होगा:
let x = 10;
x = 10 + 5; //
Now x is 15
let y = 10;
y += "5";
// Now y is "105"
दो चर जोड़ते समय, परिणाम का अनुमान लगाना मुश्किल हो सकता है:
let x = 10;
let y = 5;
let z = x + y; // Now z is 15
let x = 10;
let y = "5";
let z = x + y; // Now z is "105"
गलतफहमी तैरती है
जावास्क्रिप्ट में सभी नंबरों को 64-बिट फ्लोटिंग पॉइंट नंबर (फ्लोट्स) के रूप में संग्रहीत किया जाता है।
जावास्क्रिप्ट सहित सभी प्रोग्रामिंग भाषाओं में सटीक फ़्लोटिंग पॉइंट मानों के साथ कठिनाइयाँ होती हैं:
let x = 0.1;
let y = 0.2;
let z = x + y
// the result in z will not be 0.3
उपरोक्त समस्या को हल करने के लिए, यह गुणा और भाग करने में मदद करता है:
उदाहरण
let z = (x * 10 + y * 10) / 10; // z will be 0.3
जावास्क्रिप्ट स्ट्रिंग को तोड़ना
जावास्क्रिप्ट आपको एक कथन को दो पंक्तियों में तोड़ने की अनुमति देगा:
उदाहरण 1
let x =
"Hello World!";
लेकिन, एक स्ट्रिंग के बीच में एक स्टेटमेंट को तोड़ने से काम नहीं चलेगा:
उदाहरण 2
let x = "Hello
World!";
यदि आपको किसी स्ट्रिंग में किसी कथन को तोड़ना है, तो आपको "बैकस्लैश" का उपयोग करना चाहिए:
उदाहरण 3
let x = "Hello \
World!";
अर्धविराम का गलत स्थान
एक गलत अर्धविराम के कारण, यह कोड ब्लॉक x के मान की परवाह किए बिना निष्पादित होगा:
if (x == 19);
{
// code block
}
रिटर्न स्टेटमेंट को तोड़ना
किसी पंक्ति के अंत में किसी कथन को स्वचालित रूप से बंद करना डिफ़ॉल्ट JavaScript व्यवहार है।
इस वजह से, ये दो उदाहरण एक ही परिणाम देंगे:
उदाहरण 1
function myFunction(a) {
let power = 10
return a * power
}
उदाहरण 2
function myFunction(a) {
let power = 10;
return a * power;
}
जावास्क्रिप्ट आपको एक कथन को दो पंक्तियों में तोड़ने की भी अनुमति देगा।
इस वजह से, उदाहरण 3 भी वही परिणाम देगा:
उदाहरण 3
function myFunction(a) {
let
power = 10;
return a * power;
}
लेकिन, क्या होगा यदि आप रिटर्न स्टेटमेंट को इस तरह से दो पंक्तियों में तोड़ते हैं:
उदाहरण 4
function myFunction(a) {
let
power = 10;
return
a * power;
}
समारोह वापस आ जाएगा undefined
!
क्यों? क्योंकि जावास्क्रिप्ट ने सोचा था कि आपका मतलब है:
उदाहरण 5
function myFunction(a) {
let
power = 10;
return;
a * power;
}
व्याख्या
यदि कोई कथन अधूरा है जैसे:
let
जावास्क्रिप्ट अगली पंक्ति को पढ़कर कथन को पूरा करने का प्रयास करेगा:
power = 10;
लेकिन चूंकि यह कथन पूर्ण है:
return
जावास्क्रिप्ट स्वचालित रूप से इसे इस तरह बंद कर देगा:
return;
ऐसा इसलिए होता है क्योंकि जावास्क्रिप्ट में अर्धविराम के साथ बंद (समाप्त) कथन वैकल्पिक है।
जावास्क्रिप्ट लाइन के अंत में रिटर्न स्टेटमेंट को बंद कर देगा, क्योंकि यह एक पूर्ण स्टेटमेंट है।
रिटर्न स्टेटमेंट को कभी न तोड़ें।
नामांकित इंडेक्स के साथ ऐरे एक्सेस करना
कई प्रोग्रामिंग भाषाएं नामित इंडेक्स के साथ सरणियों का समर्थन करती हैं।
नामित अनुक्रमणिका वाले सरणी को सहयोगी सरणी (या हैश) कहा जाता है।
जावास्क्रिप्ट नामित अनुक्रमणिका के साथ सरणियों का समर्थन नहीं करता है।
जावास्क्रिप्ट में, सरणियाँ क्रमांकित अनुक्रमणिका का उपयोग करती हैं :
उदाहरण
const person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
person.length;
// person.length will return 3
person[0];
// person[0] will return "John"
जावास्क्रिप्ट में, ऑब्जेक्ट नामित अनुक्रमणिका का उपयोग करते हैं ।
यदि आप किसी नामित अनुक्रमणिका का उपयोग करते हैं, तो किसी सरणी तक पहुँचने पर, जावास्क्रिप्ट सरणी को एक मानक ऑब्जेक्ट में फिर से परिभाषित करेगा।
स्वचालित पुनर्परिभाषा के बाद, सरणी विधियाँ और गुण अपरिभाषित या गलत परिणाम देंगे:
उदाहरण:
const person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
person.length; // person.length will
return 0
person[0];
// person[0] will return undefined
अल्पविराम से परिभाषाएँ समाप्त करना
ईसीएमएस्क्रिप्ट 5 में ऑब्जेक्ट और सरणी परिभाषा में अनुगामी अल्पविराम कानूनी हैं।
वस्तु उदाहरण:
person = {firstName:"John", lastName:"Doe", age:46,}
सरणी उदाहरण:
points = [40, 100, 1, 5, 25, 10,];
चेतावनी !!
इंटरनेट एक्सप्लोरर 8 क्रैश हो जाएगा।
JSON अनुगामी अल्पविराम की अनुमति नहीं देता है।
JSON:
person = {"firstName":"John", "lastName":"Doe", "age":46}
JSON:
points = [40, 100, 1, 5, 25, 10];
अपरिभाषित शून्य नहीं है
जावास्क्रिप्ट ऑब्जेक्ट, चर, गुण और विधियाँ हो सकती हैं undefined
।
इसके अलावा, खाली JavaScript ऑब्जेक्ट का मान हो सकता है null
.
इससे यह जांचना थोड़ा मुश्किल हो सकता है कि कोई वस्तु खाली है या नहीं।
You can test if an object exists by testing if the type is undefined
:
Example:
if (typeof myObj === "undefined")
But you cannot test if an object is null
, because this will throw an error if the
object is undefined
:
Incorrect:
if (myObj === null)
To solve this problem, you must test if an object is not null
,
and not undefined
.
But this can still throw an error:
Incorrect:
if (myObj !== null && typeof myObj
!== "undefined")
Because of this, you must test for not undefined
before you can
test for not null
:
Correct:
if (typeof myObj !== "undefined" && myObj !== null)