यह जानना कि किसी डेटा का टाइप क्या है, कोड को सुचारू रूप से और बिना एरर के चलाने के लिए अक्सर बहुत ज़रूरी होता है।
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"] से ऐसा होता है।
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() नाम का एक मेथड होता है, जो जाँचता है कि उसका आर्गुमेंट एक ऐरे है या नहीं।
हालाँकि instanceof Array किसी अलग रीयल्म में बनाए गए ऐरे के साथ काम नहीं करेगा, जैसे किसी वेब पेज के iframe में, लेकिन 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
एक रीसाइक्लिंग सेंटर ने आपको नौकरी पर रखा है। जगह की कमी के कारण सारे उत्पाद एक ही कन्वेयर बेल्ट पर डाले जाते हैं, लेकिन इससे अलग-अलग सामग्री आपस में मिल जाती है और बेकार हो जाती है। इसे ठीक करने के लिए आपको ऐसे फंक्शन बनाने का काम सौंपा गया है जो किसी उत्पाद का प्रकार पहचान सकें।
isBoolean फंक्शन बनाइए, जो जाँचता है कि कोई वैल्यू बूलियन है या नहीं।
isBoolean(true);
// => true
isBoolean(null);
// => false
isNumber फंक्शन बनाइए, जो जाँचता है कि कोई वैल्यू एक सीमित number या bigint है, यानी NaN या Infinity नहीं।
कभी-कभी आईडी पढ़ने वाला डिवाइस गड़बड़ कर देता है और किसी गैर-संख्यात्मक वैल्यू को NaN (यानी संख्या नहीं) या Infinity के रूप में पढ़ लेता है।
आपके फंक्शन को इसे भी ठीक से संभाल पाना चाहिए।
isNumber(42);
// => true
isNumber('Hello, World!');
// => false
isNumber(42n);
// => true
isNumber(NaN);
// => false
isObject फंक्शन बनाइए, जो जाँचना चाहिए कि वैल्यू एक ऑब्जेक्ट है या नहीं।
कन्वेयर पर null कुछ नहीं है और इसे ऑब्जेक्ट नहीं माना जाता।
isObject({ greeting: 'Hello' });
// => true
isObject(25n);
// => false
isNumericString फंक्शन बनाइए, जो यह जाँचना चाहिए कि वैल्यू एक ऐसी स्ट्रिंग है जिसमें सिर्फ अंक हों, या ऋणात्मक संख्या दर्शाने के लिए माइनस और उसके बाद अंक हों।
यहाँ सिर्फ पूर्णांक गिने जाने चाहिए; रीसाइक्लिंग रोबोट की इस जाँच में दशमलव संख्याओं को संख्यात्मक नहीं माना जाता।
isNumericString(42);
// => false
isNumericString('42');
// => true
isNumericString('Hi!');
// => false
isElectronic फंक्शन बनाइए, जो जाँचता है कि कोई ऑब्जेक्ट दी गई ElectronicDevice क्लास का इंस्टेंस है या उसकी किसी चाइल्ड क्लास का।
class Duck {
//...
}
class WashingMachine extends ElectronicDevice {
//...
}
isElectronic(new Duck());
// => false
isElectronic(new WashingMachine());
// => true
isNonEmptyArray फंक्शन बनाइए, जो जाँचता है कि कोई वैल्यू गैर-खाली ऐरे है या नहीं।
isNonEmptyArray([1, 2, 3]);
// => true
isNonEmptyArray([]);
// => false
isEmptyArray फंक्शन बनाइए, जो जाँचता है कि कोई वैल्यू खाली ऐरे है या नहीं।
isEmptyArray([1, 2, 3]);
// => false
isEmptyArray([]);
// => true
type प्रॉपर्टी या मेथड है या नहींhasType फंक्शन बनाइए, जो जाँचता है कि किसी ऑब्जेक्ट में type प्रॉपर्टी या मेथड है या नहीं।
class Keyboard(){
type(){
// ...
}
}
hasType({ type:"car", color:"red" })
// => true
hasType({ color:"green" })
// => false
hasType(new Keyboard())
// => true
id प्रॉपर्टी या मेथड न हो, तो एरर दीजिएassertHasId फंक्शन बनाइए, जो एक Error देगा अगर किसी ऑब्जेक्ट में id प्रॉपर्टी न हो।
अगर ऑब्जेक्ट में id प्रॉपर्टी है, तो इस फंक्शन को कुछ नहीं लौटाना चाहिए।
assertHasId({ id: 42, color: 'red' });
// => undefined
assertHasId({ color: 'green' });
// Error: "Object is missing the 'id' property"
id प्रॉपर्टी है या नहींhasIdProperty फंक्शन बनाइए, जो जाँचता है कि किसी ऑब्जेक्ट में id प्रॉपर्टी है या नहीं।
class SimpleData {
constructor() {
this.number = '42';
this.id = 'BC269327FE1D9B95';
}
}
class StealingData extends SimpleData {}
class MethodData {
constructor() {
this.number = '42';
this._id = 'BC269327FE1D9B95';
}
get id() {
return this._id;
}
}
hasIdProperty(new SimpleData());
// => true
hasIdProperty(new MethodData());
// => false
hasIdProperty(new StealingData());
// => false
type प्रॉपर्टी है या नहींhasDefinedType फंक्शन बनाइए, जो जाँचता है कि किसी ऑब्जेक्ट में एक ऐसी type प्रॉपर्टी है जो undefined नहीं है।
hasDefinedType({ type: undefined, color: 'red' });
// => false
hasDefinedType({ type: 'car', color: 'green' });
// => true
Exercism पर साइन अप कीजिए और JavaScript को 37 कॉन्सेप्ट159 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।