ट्रैक
/
JavaScript
JavaScript
/
अभ्यास
/
रीसाइक्लिंग रोबोट
रीसाइक्लिंग रोबोट

रीसाइक्लिंग रोबोट

सीखने का अभ्यास

परिचय

यह जानना कि किसी डेटा का टाइप क्या है, कोड को सुचारू रूप से और बिना एरर के चलाने के लिए अक्सर बहुत ज़रूरी होता है।

JavaScript में किसी वैल्यू या ऑब्जेक्ट का टाइप जाँचने के कई तरीके हैं।

Note

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
Advanced

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
Note

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

निर्देश

निर्देश

एक रीसाइक्लिंग सेंटर ने आपको नौकरी पर रखा है। जगह की कमी के कारण सारे उत्पाद एक ही कन्वेयर बेल्ट पर डाले जाते हैं, लेकिन इससे अलग-अलग सामग्री आपस में मिल जाती है और बेकार हो जाती है। इसे ठीक करने के लिए आपको ऐसे फंक्शन बनाने का काम सौंपा गया है जो किसी उत्पाद का प्रकार पहचान सकें।

1. जाँचिए कि कोई वैल्यू बूलियन है या नहीं

isBoolean फंक्शन बनाइए, जो जाँचता है कि कोई वैल्यू बूलियन है या नहीं।

isBoolean(true);
// => true

isBoolean(null);
// => false

2. जाँचिए कि कोई वैल्यू संख्या है या नहीं।

isNumber फंक्शन बनाइए, जो जाँचता है कि कोई वैल्यू एक सीमित number या bigint है, यानी NaN या Infinity नहीं।

कभी-कभी आईडी पढ़ने वाला डिवाइस गड़बड़ कर देता है और किसी गैर-संख्यात्मक वैल्यू को NaN (यानी संख्या नहीं) या Infinity के रूप में पढ़ लेता है। आपके फंक्शन को इसे भी ठीक से संभाल पाना चाहिए।

isNumber(42);
// => true

isNumber('Hello, World!');
// => false

isNumber(42n);
// => true

isNumber(NaN);
// => false

3. जाँचिए कि कोई वैल्यू ऑब्जेक्ट है या नहीं

isObject फंक्शन बनाइए, जो जाँचना चाहिए कि वैल्यू एक ऑब्जेक्ट है या नहीं। कन्वेयर पर null कुछ नहीं है और इसे ऑब्जेक्ट नहीं माना जाता।

isObject({ greeting: 'Hello' });
// => true

isObject(25n);
// => false

4. जाँचिए कि कोई स्ट्रिंग संख्यात्मक है या नहीं

isNumericString फंक्शन बनाइए, जो यह जाँचना चाहिए कि वैल्यू एक ऐसी स्ट्रिंग है जिसमें सिर्फ अंक हों, या ऋणात्मक संख्या दर्शाने के लिए माइनस और उसके बाद अंक हों। यहाँ सिर्फ पूर्णांक गिने जाने चाहिए; रीसाइक्लिंग रोबोट की इस जाँच में दशमलव संख्याओं को संख्यात्मक नहीं माना जाता।

isNumericString(42);
// => false

isNumericString('42');
// => true

isNumericString('Hi!');
// => false

5. जाँचिए कि कोई ऑब्जेक्ट इलेक्ट्रॉनिक है या नहीं

isElectronic फंक्शन बनाइए, जो जाँचता है कि कोई ऑब्जेक्ट दी गई ElectronicDevice क्लास का इंस्टेंस है या उसकी किसी चाइल्ड क्लास का।

class Duck {
  //...
}

class WashingMachine extends ElectronicDevice {
  //...
}

isElectronic(new Duck());
// => false

isElectronic(new WashingMachine());
// => true

6. जाँचिए कि कोई वैल्यू गैर-खाली ऐरे है या नहीं

isNonEmptyArray फंक्शन बनाइए, जो जाँचता है कि कोई वैल्यू गैर-खाली ऐरे है या नहीं।

isNonEmptyArray([1, 2, 3]);
// => true

isNonEmptyArray([]);
// => false

7. जाँचिए कि कोई वैल्यू खाली ऐरे है या नहीं

isEmptyArray फंक्शन बनाइए, जो जाँचता है कि कोई वैल्यू खाली ऐरे है या नहीं।

isEmptyArray([1, 2, 3]);
// => false

isEmptyArray([]);
// => true

8. जाँचिए कि किसी ऑब्जेक्ट में type प्रॉपर्टी या मेथड है या नहीं

hasType फंक्शन बनाइए, जो जाँचता है कि किसी ऑब्जेक्ट में type प्रॉपर्टी या मेथड है या नहीं।

class Keyboard(){
  type(){
    // ...
  }
}
hasType({ type:"car", color:"red" })
// => true

hasType({ color:"green" })
// => false

hasType(new Keyboard())
// => true

9. अगर किसी ऑब्जेक्ट में id प्रॉपर्टी या मेथड न हो, तो एरर दीजिए

assertHasId फंक्शन बनाइए, जो एक Error देगा अगर किसी ऑब्जेक्ट में id प्रॉपर्टी न हो।

अगर ऑब्जेक्ट में id प्रॉपर्टी है, तो इस फंक्शन को कुछ नहीं लौटाना चाहिए।

assertHasId({ id: 42, color: 'red' });
// => undefined

assertHasId({ color: 'green' });
// Error: "Object is missing the 'id' property"

10. जाँचिए कि किसी ऑब्जेक्ट में 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

11. जाँचिए कि किसी ऑब्जेक्ट में एक परिभाषित type प्रॉपर्टी है या नहीं

hasDefinedType फंक्शन बनाइए, जो जाँचता है कि किसी ऑब्जेक्ट में एक ऐसी type प्रॉपर्टी है जो undefined नहीं है।

hasDefinedType({ type: undefined, color: 'red' });
// => false

hasDefinedType({ type: 'car', color: 'green' });
// => true
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
JavaScript Exercism

रीसाइक्लिंग रोबोट शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और JavaScript को 37 कॉन्सेप्ट159 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।