किसी डेटा का टाइप क्या है, यह जानना कोड के सुचारू रूप से और बिना एरर के चलने के लिए अक्सर बहुत ज़रूरी होता है।
JavaScript में किसी वैल्यू या ऑब्जेक्ट का टाइप जाँचने के कई तरीके हैं।
JavaScript के टाइप जाँचने के तरीके कुछ हद तक भरोसेमंद नहीं होते।
बेहतर टाइप सुरक्षा और मज़बूत टाइप के लिए आपको शायद TypeScript इस्तेमाल करना चाहिए। यह एक ऐसी भाषा है जो JavaScript पर बनी है, लेकिन इसमें स्टैटिक टाइप वाली भाषा जैसा टाइप सिंटैक्स होता है।
typeof ऑपरेटरtypeof ऑपरेटर अपने ऑपरेंड का टाइप लौटाता है।
इसका आउटपुट एक स्ट्रिंग होता है, जो प्रिमिटिव डेटा टाइप में से किसी एक के नाम से मेल खाता है, सिवाय "null" के।
यह "function" या "object" भी हो सकता है।
typeof undefined;
// => "undefined"
typeof true;
// => "boolean"
typeof 42;
// => "number"
typeof 'Hello, World!';
// => "string"
typeof function () {
return 'Hello, World';
};
// => "function"
typeof [1, 2, 3, 4];
// => "object"
typeof { city: 'Stockholm', country: 'Sweden' };
// => "object"
यह [typeof null is "object"][typeof null is "object"] की वजह से है।
instanceof ऑपरेटरकिसी ऑब्जेक्ट का टाइप जाँचने के लिए आप instanceof ऑपरेटर का उपयोग कर सकते हैं।
यह एक boolean लौटाता है, जो इस पर निर्भर करता है कि दूसरा ऑपरेंड पहले ऑपरेंड की प्रोटोटाइप चेन में शामिल है या नहीं।
साफ़ कहें तो, instanceof बताता है कि पहला ऑपरेंड दूसरे ऑपरेंड या उसकी किसी चाइल्ड क्लास का इंस्टेंस है या नहीं।
instanceof सिर्फ ऑब्जेक्ट पर ही काम करता है।
class Beverage {
// ...
}
// The Coffee class is a child of the Beverage class.
class Coffee extends Beverage {
// ...
}
const java = new Coffee();
java instanceof Coffee;
// => true
java instanceof Beverage;
// => true
Array क्लास में Array.isArray() नाम का एक मेथड है, जो जाँचता है कि उसे दिया गया आर्गुमेंट एक ऐरे है या नहीं।
किसी वेब पेज के iframe जैसे किसी और रील्म में बने ऐरे पर instanceof Array काम नहीं करेगा, लेकिन Array.isArray() करेगा।
इसका कारण यह है कि हर रील्म में Array क्लास का कंस्ट्रक्टर अलग होता है, और हर iframe का अपना रील्म होता है। इसका मतलब है कि प्रोटोटाइप चेन में वह फंक्शन अलग होगा, जिससे instanceof Array फेल हो जाता है।
Array.isArray() इस बात को नज़रअंदाज़ कर सकता है, और जब भी संभव हो इसका इस्तेमाल करना चाहिए।
यह उन गलत पहचानों से भी बच जाता है जहाँ कोई ऑब्जेक्ट वास्तव में Array नहीं है और सिर्फ़ उसकी प्रोटोटाइप चेन में Array मौजूद है।
({ __proto__: Array.prototype }) instanceof Array
// => true
Array.isArray({ __proto__: Array.prototype })
// => false
in ऑपरेटरin ऑपरेटर बताता है कि पहला ऑपरेंड दूसरे ऑपरेंड की प्रॉपर्टी है या नहीं।
यह नहीं जाँचता कि उस प्रॉपर्टी की कोई वैल्यू तय है या नहीं।
जिस प्रॉपर्टी को undefined पर सेट किया गया हो, उसे भी in पकड़ लेता है।
class Coffee {
constructor() {
this.temperature = 'hot';
this.isDarkMatter = undefined;
}
coolDown() {
this.temperature = 'warm';
}
}
const espresso = new Coffee();
'temperature' in espresso;
// => true
'color' in espresso;
// => false
'isDarkMatter' in espresso;
// => true
विरासत में मिली प्रॉपर्टी और मेथड के लिए भी in true लौटाता है।
"coolDown" in espresso
// => true
"constructor" in espresso
// => true
इससे बचने के लिए Object.hasOwn() का इस्तेमाल कीजिए
Object.hasOwn() फंक्शनObject.hasOwn() मेथड बताता है कि निर्दिष्ट ऑब्जेक्ट दी गई प्रॉपर्टी का खुद का है या नहीं (यानी वह विरासत में नहीं मिली है और न ही कोई मेथड है)।
class Coffee {
constructor() {
this.temperature = 'hot';
}
coolDown() {
this.temperature = 'warm';
}
}
const cappuccino = new Coffee();
Object.hasOwn(cappucino, 'temperature');
// => true
Object.hasOwn(cappucino, 'constructor');
// => false
Object.hasOwn(cappucino, 'coolDown');
// => false