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अगली बार मिलते हैं।
Community Posts
No posts yet. Be the first to write about this video!
Write about this video