2027 में आने वाली 4 नई JavaScript विशेषताएँ

BBetter Stack
Computing/Software

Transcript

00:00:00यदि आपको लगता है कि आप जावास्क्रिप्ट जानते हैं, तो इन सवालों के जवाब देने की कोशिश करें।
00:00:02स्ट्रिंग 0 के साथ new Date का उपयोग करने पर आपको क्या मिलता है?
00:00:07क्या आपको लगा कि यह यूनिक्स एpoch टाइम था?
00:00:09खैर, आप गलत होंगे, क्योंकि जावास्क्रिप्ट स्ट्रिंग 0 को वर्ष 2000 मानती है, बस ऐसे ही।
00:00:14ठीक है, लेकिन क्या होगा अगर यह संख्या 0 हो?
00:00:19खैर, कम से कम यह वाला तो समझ आता है, यह 1 जनवरी, 1970 है,
00:00:22और यह जानते हुए कि, अगर हम इन दोनों 0 पर date.parse करें,
00:00:25हम जानते हैं कि वे समान नहीं हैं, इसलिए यदि हमने उनकी तुलना की, तो यह असत्य (false) होना चाहिए।
00:00:28सिवाय इसके कि, यह गलत है।
00:00:30Date.parse केवल स्ट्रिंग्स पर काम करता है, इसलिए यह संख्या 0 को एक स्ट्रिंग में बदल देता है,
00:00:34इसलिए ये दोनों फिर से वर्ष 2000 हैं।
00:00:36यह इस क्विज़ के 28 में से केवल तीसरा सवाल है, और मुझे अभी से गुस्सा आ रहा है।
00:00:40शुक्र है कि इसे ठीक करने के लिए Temporal आ रहा है,
00:00:42और यह जावास्क्रिप्ट 2027 के लिए चार पक्की विशेषताओं में से सिर्फ एक है,
00:00:45साथ ही कुछ वास्तव में दिलचस्प प्रस्ताव जो पक्के होने के करीब हैं,
00:00:48जिसमें एक ऐसा प्रस्ताव भी शामिल है जो हर फ्रेमवर्क के काम करने के तरीके को बदल सकता है।
00:00:56आइए सबसे बड़ी विशेषता से शुरू करें, Temporal।
00:00:57यह नया डेट एपीआई है जिस पर पूरे 9 लंबे वर्षों से काम चल रहा है,
00:01:01लेकिन मार्च में यह आखिरकार स्टेज 4 पर पहुंच गया, जिसका मतलब है कि यह तैयार है।
00:01:04यदि आप नहीं जानते कि इससे हर जावास्क्रिप्ट डेवलपर क्यों खुश है,
00:01:07तो मैं आपसे आग्रह करता हूँ कि वह क्विज़ लें।
00:01:08यह कोई आश्चर्य की बात नहीं है कि अधिकांश लोग Moment, Luxon, या Date functions जैसी लाइब्रेरी का उपयोग करते हैं,
00:01:12और मैंने वास्तव में पिछले वीडियो में Temporal को पूरी तरह से कवर किया है,
00:01:15इसलिए इस तरह की चीज़ों से अपडेट रहने के लिए सब्सक्राइब करें।
00:01:18Temporal का सार यह है कि एक गंदे डेट ऑब्जेक्ट के बजाय जो हर काम को खराब तरीके से करता है,
00:01:22आपको अलग-अलग प्रकार मिलते हैं जो प्रत्येक एक काम को ठीक से करते हैं।
00:01:24Temporal PlainDate केवल एक कैलेंडर तिथि है जिसमें निपटने के लिए कोई समय या समय क्षेत्र नहीं है।
00:01:28PlainTime केवल एक दीवार घड़ी का समय है जिसमें निपटने के लिए कोई तारीख नहीं है।
00:01:31Instant समय में एक विशिष्ट बिंदु का प्रतिनिधित्व करता है, यानी यूनिक्स एpoch के बाद के नैनोसेकंड,
00:01:36बिना किसी समय क्षेत्र या कैलेंडर प्रणाली के।
00:01:38ZonedDateTime एक वास्तविक समय क्षेत्र में एक पूर्ण तिथि है,
00:01:40और यह डेलाइट सेविंग टाइम को समझता है।
00:01:42और अवधि है, जो आपको वास्तविक तिथि गणित देती है,
00:01:44इसलिए आपके कोडबेस में मिलीसेकंड या अन्य यादृच्छिक गणित जोड़ने की आवश्यकता नहीं है।
00:01:48इन सभी के एक साथ काम करने के एक उदाहरण के रूप में,
00:01:50मान लीजिए कि मेरे पास न्यूयॉर्क से लंदन की एक उड़ान है जो रविवार 24 अक्टूबर को न्यूयॉर्क के समय अनुसार रात 8 बजे निकलती है,
00:01:55और उड़ान में 7 घंटे लगते हैं।
00:01:57लंदन 5 घंटे आगे है, इसलिए रात 8 बजे और 7 घंटे की उड़ान का मतलब न्यूयॉर्क के समय अनुसार सुबह 3 बजे है,
00:02:01 जिसका मतलब है कि मुझे लंदन में सुबह 8 बजे उतरना चाहिए।
00:02:03सिवाय इसके कि यहाँ Temporal सुबह 7 बजे कह रहा है, और यह सही होगा।
00:02:07यह उड़ान वास्तव में उस रात होती है जब लंदन में घड़ियाँ पीछे जाती हैं,
00:02:09और Temporal यह जानता है और इसे मेरे लिए संभाल रहा है।
00:02:12और यदि आपको विश्वास नहीं है कि उड़ान के दौरान घड़ियाँ बदलती हैं,
00:02:14तो वास्तव में आपको इसका अनुमान लगाने की आवश्यकता नहीं है,
00:02:15आप बस getTimeZoneTransition का उपयोग कर सकते हैं,
00:02:17जो मुझे बताता है कि परिवर्तन लंदन के समय अनुसार रात 1 बजे था।
00:02:19एक अन्य उदाहरण के रूप में, यदि मेरे पास सुबह 11 बजे की मीटिंग है जिसे मैं एक दिन आगे बढ़ाना चाहता हूँ,
00:02:23लेकिन रात भर में घड़ियाँ बदल जाती हैं,
00:02:24तो मैं अचानक नहीं चाहता कि वह मीटिंग सुबह 10 बजे हो,
00:02:26और Temporal के साथ, ऐसा होना जरूरी नहीं है।
00:02:28यह जानता है कि मैं यहाँ दिनों में काम कर रहा हूँ, घंटों में नहीं।
00:02:31Temporal का दूसरा बड़ा फायदा यह है कि अब सब कुछ अपरिवर्तनीय (immutable) है,
00:02:34इसलिए प्रत्येक ऑपरेशन एक बिल्कुल नया ऑब्जेक्ट लौटाता है,
00:02:36ताकि आपको यह अंदाजा न लगाना पड़े कि क्या आपकी मूल तिथि आपके कोड में कहीं बदल गई है।
00:02:40और अगर वह सब काफी नहीं था,
00:02:41यह तिथियों को छांटना भी आसान बनाता है,
00:02:43तक के दिनों की गणना करना आसान बनाता है,
00:02:45तिथियों को राउंड करना,
00:02:45और महीने भी शून्य से शुरू होते हैं।
00:02:47यह काफी अभूतपूर्व चीज़ है।
00:02:49यह जावास्क्रिप्ट डेट ऑब्जेक्ट से कहीं अधिक बेहतर है,
00:02:51और अच्छी खबर यह है कि आपको इसे आजमाने के लिए इंतजार नहीं करना पड़ेगा।
00:02:53Firefox, Chrome, Node.js, और Deno में यह पहले से ही है,
00:02:56Bun जल्द ही आ रहा है,
00:02:57और Safari को बराबरी करने की जरूरत है।
00:02:58विशेषता नंबर दो पर चलते हैं,
00:03:00हमारे पास स्पष्ट संसाधन प्रबंधन है,
00:03:01यानी using कीवर्ड।
00:03:03यह मई में स्टेज चार पर पहुंच गया।
00:03:05जब भी आप ऐसी कोई चीज़ लेते हैं जिसे साफ करने की आवश्यकता होती है,
00:03:06जैसे फ़ाइल हैंडल, डेटाबेस कनेक्शन, या कोई स्ट्रीम,
00:03:09आपको काम पूरा होने पर उसे जारी करना होता है।
00:03:10इसका आमतौर पर मतलब हर जगह try finally ब्लॉक होता था,
00:03:13या आप बस भूल जाते,
00:03:14और अब आपके पास एक संसाधन लीक है।
00:03:16हालांकि अब,
00:03:16using कीवर्ड यह सुनिश्चित करता है कि जब कोई चर (variable) दायरे से बाहर हो जाता है,
00:03:19चाहे वह इसलिए हो कि यह ब्लॉक का अंत है,
00:03:20एक शुरुआती रिटर्न,
00:03:21या कोई अपवाद (exception),
00:03:22जावास्क्रिप्ट स्वचालित रूप से ऑब्जेक्ट के Symbol.dispose विधि को कॉल करता है।
00:03:25इसके अलावा,
00:03:26async dispose के साथ असमकालिक (async) सफाई का उपयोग करने का एक तरीका भी है,
00:03:29और कई संसाधनों को संयोजित करने के लिए एक डिस्पोजेबल स्टैक है,
00:03:32ताकि वे विपरीत क्रम में समाप्त हों।
00:03:33यह उन अच्छे सहायक उपकरणों में से एक है
00:03:35जो उन try finally ब्लॉकों के साथ हमारे कुछ कोड को साफ करने में मदद करना चाहिए,
00:03:38और अच्छी खबर यह है कि,
00:03:39यह काफी समय से Firefox, Chrome, Node, Bun, और Deno में है,
00:03:42इसलिए आपने शायद इसका पहले ही उपयोग कर लिया होगा।
00:03:43अगला,
00:03:44विशेषता नंबर तीन के लिए,
00:03:44हमारे पास एक अधिक विशिष्ट विशेषता है,
00:03:45जो संयुक्त पुनरावृत्ति (joint iteration) है,
00:03:47यानी Iterator.zip।
00:03:48मान लीजिए मेरे पास तीन सरणी (arrays) हैं,
00:03:50names, age, और cities,
00:03:51और मैं इन्हें एक में संयोजित करना चाहता हूँ।
00:03:52खैर, iterator.zip ऐसा कर सकता है,
00:03:54क्योंकि यह हमें समानांतर में कई इटेरेबल्स पर पुनरावृत्ति करने देता है,
00:03:56और हमें प्रत्येक इनपुट के लिए अगला मान युक्त एक सरणी देता है।
00:04:00zipKeyed भी है जो बिल्कुल यही काम करता है,
00:04:02लेकिन इसके बजाय आपको नामित ऑब्जेक्ट देता है,
00:04:03और दोनों में इस बात के लिए भी विकल्प हैं कि क्या होता है जब इनपुट इटेरेबल्स अलग-अलग लंबाई के होते हैं,
00:04:07इसलिए mode सबसे छोटा (shortest) हो सकता है,
00:04:08 जिसका मतलब है कि जैसे ही सबसे छोटा इटेरेबल समाप्त हो, रुक जाओ।
00:04:11यह डिफ़ॉल्ट है।
00:04:12सबसे लंबा (longest) तब तक चलता रहेगा जब तक सबसे लंबा इटेरेबल समाप्त नहीं हो जाता,
00:04:15और strict यदि इनपुट अलग-अलग लंबाई के हैं तो एक टाइप एरर फेंक देगा।
00:04:17सबसे लंबे के साथ भी,
00:04:18आप वास्तव में इस बात के लिए पैडिंग मान प्रदान कर सकते हैं कि जब कोई प्रविष्टि गायब हो तो क्या होता है।
00:04:21ये विशेषताएँ हाल के वर्षों में इटेरेबल्स पर किए गए काम की निरंतरता प्रतीत होती हैं।
00:04:26ES 2025 ने हमें map, filter, take, और drop जैसे सहायक उपकरण दिए,
00:04:29और वर्तमान में कुछ स्टेज तीन प्रस्ताव हैं जैसे iterator chunking,
00:04:32iterator includes, और iterator join।
00:04:34मूल रूप से, बस अधिक से अधिक विशेषताएँ जो Lodash की आवश्यकता को समाप्त करती हैं।
00:04:37आप वास्तव में आज केवल Firefox में zip का उपयोग कर सकते हैं,
00:04:39लेकिन उम्मीद है कि अन्य लोग भी बराबरी कर लेंगे।
00:04:40हमारी चौथी पक्की विशेषता की ओर बढ़ते हुए,
00:04:42यह काफी निम्न-स्तरीय (low-level) है,
00:04:43atomics.pause,
00:04:45और मैं इसके साथ जल्दी करूँगा क्योंकि जब तक आप मल्टी-थ्रेडेड कोड नहीं लिख रहे हैं,
00:04:47एक साझा सरणी बफर (shared array buffer) के साथ,
00:04:49आप शायद इसका सामना नहीं करेंगे।
00:04:50यदि हम मेमोरी के चार बाइट बनाते हैं जिन्हें थ्रेड्स या वर्कर्स के बीच साझा किया जा सकता है,
00:04:53और फिर हम उन बाइट्स का उपयोग एक पूर्णांक लॉक के रूप में करते हैं,
00:04:56तो while लूप में, हम atomics.compareExchange का उपयोग करते हैं
00:04:58यह कहने के लिए कि यदि यह मान अनलॉक है, तो इसे लॉक करें,
00:05:01और यदि मान लॉक है,
00:05:02लूप करते रहें क्योंकि कोई और इसका उपयोग कर रहा है,
00:05:04और हम तब तक प्रतीक्षा करना चाहते हैं जब तक वे समाप्त न हो जाएं।
00:05:06इसे स्पिनिंग या बिजी वेटिंग कहा जाता है,
00:05:08और समस्या यह है कि इस तरह का एक टाइट लूप CPU पर भारी पड़ सकता है।
00:05:11इसलिए runtime या CPU को यह बताने के लिए atomics.pause का उपयोग किया जाता है,
00:05:14मैं यहाँ जानबूझकर स्पिन कर रहा हूँ,
00:05:16मैं कुछ बदलने का इंतज़ार कर रहा हूँ,
00:05:17और फिर CPU स्पिन लूप को अधिक कुशलता से संभाल सकता है।
00:05:20जैसा कि आप देख सकते हैं, यह एक बहुत ही निम्न-स्तरीय विशेषता है,
00:05:22इसलिए इसका उपयोग ज्यादातर लाइब्रेरी लेखकों या प्रदर्शन-संवेदनशील कोड द्वारा किया जाता है,
00:05:25और यह अधिकांश ब्राउज़रों में समर्थित है,
00:05:27Bun, Deno,
00:05:28और यहाँ तक कि Node में भी मेरे लिए काम किया,
00:05:29भले ही MDN ने कहा था कि ऐसा नहीं होना चाहिए।
00:05:30तो ये हमारी चार पक्की विशेषताएँ हैं,
00:05:32सभी स्टेज चार पर हैं और ES 2027 का हिस्सा होने की उम्मीद है।
00:05:36लेकिन अब स्टेज 3 के बारे में बात करते हैं,
00:05:37क्योंकि इनमें से कुछ अभी उपलब्ध हैं।
00:05:39सबसे पहले, हमारे पास import defer है।
00:05:40जब इसे किसी इम्पोर्ट पर इस्तेमाल किया जाता है,
00:05:41तो मॉड्यूल लोड हो जाता है,
00:05:42लेकिन इसका कोई भी कोड असल में तब तक रन नहीं होता जब तक आप पहली बार इसका इस्तेमाल नहीं करते,
00:05:46इसलिए आपको लेज़ी एग्जीक्यूशन मिलता है।
00:05:47यह डायनेमिक इम्पोर्ट से मिलने वाली चीज़ों से अलग है,
00:05:49जो आपको लेज़ी लोडिंग देते हैं,
00:05:51इसलिए यह मॉड्यूल को डाउनलोड करने का इंतज़ार करता है,
00:05:52लेकिन एक बार फ़ेッチ होने के बाद यह टॉप-लेवल कोड को रन होने से नहीं रोकता।
00:05:55इससे बहुत बड़े डिपेंडेंसी ग्राफ़ वाले ऐप्स के
00:05:57स्टार्टअप टाइम में कुछ मदद मिलनी चाहिए।
00:05:59दूसरा, promise.all keyed है।
00:06:01promise.all आपको एक ऐरे देने के बजाय
00:06:03जिसे आप पोज़ीशन के हिसाब से डिस्ट्रक्चर करते हैं,
00:06:04आप एक ऑब्जेक्ट पास करते हैं और आपको नेम्ड रिजल्ट्स मिलते हैं।
00:06:06यह एक काफ़ी छोटा फ़ीचर है,
00:06:08लेकिन जब इसकी घोषणा की गई थी तो इसने बहुत से लोगों को बहुत खुश कर दिया था।
00:06:11आगे बढ़ते हैं, हमारे पास डेकोरेटर्स हैं।
00:06:12ये 2022 से स्टेज 3 में हैं,
00:06:14लेकिन BUN ने फरवरी में स्टैंडर्ड डेकोरेटर्स शिप किए,
00:06:16और मुझे हैरानी होती है कि यह स्टेज 4 में कब पहुँचेगा।
00:06:19आख़िरकार, यहाँ एक ऐसा प्रस्ताव है जो मुझे वाकई रोमांचक लगता है,
00:06:21लेकिन यह स्टेज 1 पर है,
00:06:22इसलिए इसे आने में कुछ समय लग सकता है,
00:06:24लेकिन वह सिग्नल्स है।
00:06:25इससे जावास्क्रिप्ट में एक इन-बिल्ट रिएक्टिव स्टेट प्रिमिटिव जुड़ जाएगा
00:06:27राइटेबल वैल्यूज़ के साथ,
00:06:29कंप्यूटेड वैल्यूज़,
00:06:29और ऑटोमैटिक डिपेंडेंसी ट्रैकिंग के साथ,
00:06:31और इसका लक्ष्य Angular, Vue, Svelte,
00:06:33और Solid जैसे फ़्रेमवर्क्स को
00:06:33उस रिएक्टिविटी के लिए एक आम लो-लेवल फ़ाउंडेशन देना है,
00:06:36ताकि वे सभी अपने मौजूदा स्वतंत्र इम्प्लीमेंटेशन के बजाय
00:06:38एक स्टैंडर्डाइज़्ड कोर का इस्तेमाल कर सकें।
00:06:40तो ये लीजिए।
00:06:41यही वह चीज़ है जो TC39 से ES2027 में मिलने की उम्मीद है।
00:06:44आपका पसंदीदा फ़ीचर कौन सा है,
00:06:45और क्या आपने इसका इस्तेमाल कर लिया है?
00:06:47मुझे नीचे कमेंट में ज़रूर बताएं।
00:06:48जब आप वहाँ हों, तो सब्सक्राइब करें,
00:06:49और हमेशा की तरह, अगली वीडियो में मिलते हैं।
00:06:50अगली बार मिलते हैं।

Key Takeaway

जावास्क्रिप्ट 2027 में टेम्पोरल, using कीवर्ड, Iterator.zip और atomics.pause जैसी नई विशेषताएँ आ रही हैं जो तिथि प्रबंधन, संसाधन सफाई और मल्टी-थ्रेडिंग को बेहतर बनाती हैं।

Highlights

  • टेम्पोरल एपीआई 9 वर्षों के विकास के बाद स्टेज 4 पर पहुँच गया है और यह जावास्क्रिप्ट में जटिल तिथियों और समय क्षेत्रों को संभालता है।

  • using कीवर्ड चर के दायरे से बाहर होने पर Symbol.dispose विधि को स्वचालित रूप से कॉल करता है।

  • Iterator.zip एकाधिक इटेरेबल्स को समानांतर में संयोजित करता है और सबसे छोटे, सबसे लंबे या सख्त मोड का समर्थन करता है।

  • atomics.pause साझा सरणी बफर के साथ मल्टी-थ्रेडेड कोड में CPU स्पिन लूप दक्षता में सुधार करता है।

  • import defer मॉड्यूल लोड करता है लेकिन पहली बार उपयोग होने तक इसके कोड को निष्पादित होने से रोकता है।

Timeline

जावास्क्रिप्ट में नई तिथियाँ और टेम्पोरल एपीआई

  • पुराने डेट ऑब्जेक्ट की समस्याओं को हल करने के लिए टेम्पोरल एपीआई आ रहा है।
  • टेम्पोरल अलग-अलग प्रकार प्रदान करता है जैसे PlainDate, PlainTime, Instant और ZonedDateTime।
  • प्रत्येक ऑपरेशन एक नया अपरिवर्तनीय ऑब्जेक्ट लौटाता है।

पारंपरिक जावास्क्रिप्ट डेट ऑब्जेक्ट में कई कमियाँ और भ्रम हैं, जैसे स्ट्रिंग 0 को वर्ष 2000 मानना। टेम्पोरल एपीआई इन समस्याओं को दूर करता है और समय क्षेत्रों, डेलाइट सेविंग टाइम और तिथि गणित को सटीक रूप से संभालता है। यह Firefox, Chrome और Node.js में उपलब्ध है।

स्पष्ट संसाधन प्रबंधन और using कीवर्ड

  • using कीवर्ड फाइल हैंडल और डेटाबेस कनेक्शन जैसे संसाधनों को स्वचालित रूप से साफ करता है।
  • यह चर के दायरे से बाहर होने पर Symbol.dispose विधि को कॉल करता है।

संसाधनों को मैन्युअल रूप से जारी करने के लिए पहले try-finally ब्लॉकों की आवश्यकता होती थी, जिससे मेमोरी लीक का जोखिम रहता था। using कीवर्ड इस प्रक्रिया को स्वचालित करता है, चाहे ब्लॉक समाप्त हो जाए, शुरुआती रिटर्न हो या कोई अपवाद आए।

संयुक्त पुनरावृत्ति और Iterator.zip

  • Iterator.zip एकाधिक सरणियों को समानांतर में संयोजित करने की अनुमति देता है।
  • यह सबसे छोटे, सबसे लंबे या सख्त लंबाई मिलान के लिए विभिन्न मोड प्रदान करता है।

यह विशेषता Lodash जैसी बाहरी लाइब्रेरी की आवश्यकता को कम करती है। यह डेवलपर्स को एक साथ कई इटेरेबल्स पर पुनरावृत्ति करने और गायब प्रविष्टियों के लिए पैडिंग मान प्रदान करने की सुविधा देती है।

निम्न-स्तरीय विशेषताएँ और भविष्य के प्रस्ताव

  • atomics.pause मल्टी-थ्रेडेड कोड में CPU स्पिन लूप को अनुकूलित करता है।
  • import defer मॉड्यूल निष्पादन में देरी करता है ताकि स्टार्टअप समय में सुधार हो सके।
  • सिग्नल्स प्रस्ताव भविष्य के फ्रेमवर्क के लिए एक मानकीकृत रिएक्टिव फाउंडेशन का लक्ष्य रखता है।

atomics.pause मुख्य रूप से लाइब्रेरी लेखकों के लिए है जो साझा सरणी बफर का उपयोग करते हैं। इसके अलावा, import defer और सिग्नल्स जैसे स्टेज 3 और स्टेज 1 के प्रस्ताव ऐप के प्रदर्शन को बेहतर बनाने और फ्रेमवर्क के बीच एक सामान्य आधार प्रदान करने की दिशा में काम कर रहे हैं।

Community Posts

No posts yet. Be the first to write about this video!

Write about this video