जावास्क्रिप्ट में वास्तव में क्या प्रकार है?
उदाहरण के लिए, के ==बजाय के उपयोग पर ===?
जावास्क्रिप्ट में वास्तव में क्या प्रकार है?
उदाहरण के लिए, के ==बजाय के उपयोग पर ===?
जवाबों:
टाइप कॉर्किशन का अर्थ है कि जब एक ऑपरेटर के ऑपरेशंस अलग-अलग प्रकार के होते हैं, तो उनमें से एक को दूसरे ऑपरेंड के प्रकार के "समतुल्य" मूल्य में बदल दिया जाएगा। उदाहरण के लिए, यदि आप करते हैं:
boolean == integer
बूलियन ऑपरेंड को एक पूर्णांक में परिवर्तित किया जाएगा: falseबन जाता है 0, true1. बन जाता है। फिर दो मूल्यों की तुलना की जाती है।
हालाँकि, यदि आप गैर-रूपांतरित तुलना ऑपरेटर का उपयोग करते हैं, तो ===ऐसा कोई रूपांतरण नहीं होता है। जब ऑपरेंड विभिन्न प्रकार के होते हैं, तो यह ऑपरेटर वापस आ जाता है false, और केवल उसी प्रकार के होने पर मूल्यों की तुलना करता है।
===जब मैं तुलना करना चाहता हूं कि क्या मूल्य दूसरे के बराबर है?
> , <?
आइए एक लघु परिचय से टाइप सिस्टम की शुरुआत करें, जो मुझे लगता है कि आपको टाइप कॉर्शन के सामान्य विचार को समझने में मदद करेगा।
भाषा की प्रकार प्रणाली नियमों को परिभाषित करती है जो हमें बताती है कि उस भाषा में किस प्रकार के डेटा मौजूद हैं और उन्हें विभिन्न ऑपरेटरों का उपयोग करके कैसे जोड़ा जा सकता है। उदाहरण के लिए, एक ऐसा नियम निर्दिष्ट कर सकता है कि प्लस (+) ऑपरेटर केवल संख्याओं पर कार्य करता है। ये नियम मुख्य रूप से पैर में खुद को गोली मारने से रोकने के लिए मौजूद हैं। लेकिन क्या होता है जब प्रोग्रामर प्रोग्राम में उस नियम को तोड़ता है? प्रोग्रामर को टाइप करने से {} + {}या प्रोग्राम को रोकने से कुछ “hello” + 5भी नहीं होता है, भले ही भाषा को नहीं लगता कि उन अभिव्यक्तियों का कोई मतलब है।
अंततः उन स्थितियों में क्या होता है यह इस बात पर निर्भर करता है कि भाषा अपने प्रकार के नियमों के बारे में कितनी सख्त है।
एक भाषा प्रकार प्रणाली अक्सर आपके नियमों को तोड़ने के बारे में दो पदों में से एक रखती है:
टाइप सिस्टम वाली भाषाएं जो इसके नियमों के बारे में पहला स्थान लेती हैं उन्हें बोलचाल की भाषा में "दृढ़ता से टाइप की गई" भाषा के रूप में जाना जाता है। वे आपको इसके नियमों को नहीं तोड़ने देने के बारे में सख्त हैं। जो दूसरा तरीका अपनाते हैं (जैसे कि जावास्क्रिप्ट) को "कमजोर टाइप" या "शिथिल टाइप" भाषा के रूप में जाना जाता है। निश्चित रूप से, आप नियमों को तोड़ सकते हैं, लेकिन आश्चर्यचकित न हों जब यह आपके प्रोग्राम में आपके द्वारा बताए गए डेटा के प्रकार को उसके नियमों का पालन करने के लिए मजबूर करता है। उस व्यवहार को ... (ड्रम रोल) के रूप में जाना जाता है ... प्रकार का जोर ।
अब आइए जावास्क्रिप्ट में कुछ उदाहरण देखें। सबसे पहले, आइए एक अभिव्यक्ति के साथ शुरू करें जो टाइप ज़बरदस्ती नहीं करता है।
5 + 5
दो संख्याओं के साथ + ऑपरेटर का उपयोग करना जो पूरी तरह से मान्य है। कार्यक्रम का मतलब + जोड़ना "जोड़ना" होगा और खुशी से दो संख्याओं को जोड़ना होगा। कोई रूपांतरण आवश्यक नहीं है।
लेकिन क्या बारे में …
[] + 5
उह ओह। जावास्क्रिप्ट में, +दो नंबर जोड़ सकते हैं या दो तार जोड़ सकते हैं। इस मामले में, हमारे पास न तो दो नंबर हैं और न ही दो तार हैं। हमारे पास केवल एक संख्या और एक वस्तु है। जावास्क्रिप्ट के प्रकार के नियमों के अनुसार, इसका कोई तार्किक अर्थ नहीं है। चूंकि यह आपके नियमों को तोड़ने के बारे में क्षमा कर रहा है, दुर्घटनाग्रस्त होने के बजाय यह वैसे भी इसका अर्थ बनाने की कोशिश करता है। तो जावास्क्रिप्ट क्या करता है? खैर, यह जानता है कि स्ट्रिंग्स को कैसे बदलना है, इसलिए यह दोनों [] और 5 को स्ट्रिंग्स में परिवर्तित करता है और परिणाम स्ट्रिंग मान "5" है।
तुलना ऑपरेटरों के साथ क्या सौदा है ==और ===? दो तुलनात्मक ऑपरेटर क्यों हैं?
==जावास्क्रिप्ट के प्रकार रूपांतरण व्यवहार के लिए प्रतिरक्षा नहीं है। भाव जैसे कि 5 == “5”सही का मूल्यांकन करेंगे क्योंकि जावास्क्रिप्ट उनमें से एक को बदलने का प्रयास करेगा ताकि यह उसी प्रकार के डेटा की तुलना कर सके।
कई मामलों में, यह वांछनीय नहीं है क्योंकि आप शायद जानना चाहते हैं कि क्या आपके द्वारा तुलना किए जा रहे कुछ डेटा एक अलग प्रकार के हैं ताकि आप यह तय कर सकें कि इसके बारे में क्या करना है। यहीं पर ===ऑपरेटर आता है। जब आप उपयोग करते हैं ===, तो कोई भी प्रकार का रूपांतरण नहीं होगा। इसलिए, अभिव्यक्ति 5 === “5”झूठी का मूल्यांकन करेगी।
पायथन में यदि आप तार, और पूर्णांक जोड़ने की कोशिश करते हैं, तो आपको एक त्रुटि मिलती है:
>>> "hi" + 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
फिर भी जावास्क्रिप्ट में, आप नहीं। 10एक स्ट्रिंग में परिवर्तित हो जाता:
> "hi" + 10
"hi10"
"टाइप ज़बरदस्ती" उपरोक्त के लिए सिर्फ एक फैंसी मिथ्या नाम है। वास्तविकता में, जावा या सी या अन्य भाषाओं में स्थिर प्रकार के सिस्टम के साथ न तो भाषा में "प्रकार" है। भाषाएं विभिन्न गैर-सांख्यिकीय रूप से टाइप किए गए मूल्यों के बीच बातचीत कैसे करती हैं, यह पसंद और सम्मेलन का विषय है।
मुझे निम्नलिखित उदाहरण के साथ प्रकार के जोर की व्याख्या करने दें
टाइप कॉर्शन का मतलब होता है जावास्क्रिप्ट का अपने आप (ऑन-द-फ्लाई) एक चर को एक डेटाटाइप से दूसरे में कनवर्ट करता है
Ex: 123 + "4"आम तौर पर एक त्रुटि होती है, लेकिन जावास्क्रिप्ट में टाइप कॉर्शन के कारण यह 1234एक स्ट्रिंग में परिणत होता है
if(23 == "23"){
console.log(" this line is inside the loop and is executed ");
}
उपरोक्त कोड में, प्रकार के जोर के कारण - जावास्क्रिप्ट सोचता है 23(संख्या) और "23"(स्ट्रिंग) एक ही बात है। यह स्थिति को सत्य बनाता है और कंसोल को प्रिंट करता है
दूसरे मामले में
if(23 === "23"){
console.log(" this line is inside the loop and is NOT executed");
}
में ===मामला जावास्क्रिप्ट प्रकार बलात्कार नहीं करता है, और के बाद से 23एक संख्या है और "23"स्ट्रिंग है और इस वजह से ===इन दोनों डेटाटाइप्स अलग हैं और हालत में गलत पर कि सुराग। यह कंसोल को प्रिंट नहीं करता है
सरल शब्दों में
इस मामले में =यह एक असाइनमेंट ऑपरेटर है - जो मानों को असाइन करता है जैसे कि var a = 3;, आदि
(नीचे ऑपरेटर तुलना के लिए हैं)
इस स्थिति में ==जावास्क्रिप्ट, डेटाटाइप को दूसरे में कनवर्ट करता है / करता है और फिर उसकी तुलना करता है।
इस मामले में === जावास्क्रिप्ट डेटाटाइप को परिवर्तित / coerces नहीं करता है
बग से बचने के लिए और डिबगिंग उद्देश्यों के ===लिए ज्यादातर उपयोग किया जाता है
कृपया मुझे उपरोक्त जानकारी की सटीकता की जानकारी दें।
जावास्क्रिप्ट में टाइप ज़बरदस्ती तब होती है जब जावास्क्रिप्ट इंजन को एक निश्चित ऑपरेशन करना पड़ता है जिसके लिए उसे एक निश्चित प्रकार में डेटा की आवश्यकता होती है। जब इंजन एक निश्चित प्रकार में डेटा का सामना करता है जो ऑपरेशन के लिए लागू नहीं होता है तो यह डेटा को एक निश्चित प्रकार में ले जाता है। इसकी आवश्यकता है क्योंकि जावास्क्रिप्ट में चर गतिशील रूप से टाइप किए जाते हैं, जिसका अर्थ है कि किसी दिए गए चर को किसी भी प्रकार का मान सौंपा जा सकता है।
if(1){
// 1 gets coerced to true
}
if(4 > '3') {
// 3 gets coerced into a number
}
44 == "44" // true, the string 44 gets converted to a nr
जावास्क्रिप्ट ज़बरदस्ती में, सभी मूल्यों को trueनिम्न मूल्यों को छोड़कर परिवर्तित किया जाता है जो निम्न हैं false:
console.log(!!""); // false
console.log(!!0); // false
console.log(!!null); // false
console.log(!!undefined); // false
console.log(!!NaN); // false
console.log(!!false); // false
यह भी ध्यान दें कि उपरोक्त उदाहरण में कि डबल! ऑपरेटर का उपयोग किया जाता है। ! निशान ऑपरेटर विपरीत मूल्य के साथ एक बूलियन में एक मूल्य coerces। हम किसी भी मूल्य को बूलियन में बदलने के लिए दो बार इस ऑपरेटर का उपयोग कर सकते हैं।
a == bइसका मतलब है कि अगर जावास्क्रिप्ट का मूल्यांकन मूल्यों के आधार पर किया जा सकता है तो इसके आधार पर जावास्क्रिप्ट का मूल्यांकन aकिया bजाएगा। उदाहरण के लिए, false == 0सच का मूल्यांकन करेगा क्योंकि 0 भी बूलियन के मूल्य का गलत है। हालांकि, false === 0गलत का मूल्यांकन करेगा क्योंकि कड़ाई से तुलना करने पर, 0 उतना ही भौतिक मूल्य नहीं है जितना कि गलत है। एक अन्य उदाहरण false == ''तो मूल रूप से ढीली तुलना बनाम सख्त तुलना है, क्योंकि जावास्क्रिप्ट एक शिथिल टाइप की भाषा है। यह कहना है, जावास्क्रिप्ट कोड के संदर्भ के आधार पर चर को परिवर्तित करने का प्रयास करेगा, और यह चीजों को समान बनाने का प्रभाव है यदि उनकी कड़ाई से तुलना नहीं की जाती है। php का भी यही व्यवहार है।
0 is not the same physical value as false। आईएमओ शारीरिक रूप falseसे 0स्मृति में है। मैं कहूंगा कि वे प्रकार से भिन्न हैं, चूंकि falseबूलियन है, जबकि 0पूर्णांक है।
टाइप कॉर्किशन एक प्रकार से दूसरे (जैसे स्ट्रिंग से नंबर, ऑब्जेक्ट टू बूलियन, और इसी तरह) से मान को परिवर्तित करने की प्रक्रिया है। किसी भी प्रकार, यह आदिम या एक वस्तु हो, प्रकार के जबरदस्ती के लिए एक वैध विषय है। याद करने के लिए, आदिम हैं: संख्या, स्ट्रिंग, बूलियन, अशक्त, अपरिभाषित + प्रतीक (ईएस 6 में जोड़ा गया)।
स्पष्ट बनाम स्पष्ट जोर प्रकार का बल स्पष्ट और निहित हो सकता है।
जब कोई डेवलपर उपयुक्त कोड लिखकर प्रकारों के बीच रूपांतरण करने की मंशा व्यक्त करता है, जैसे Number(value), तो इसे स्पष्ट प्रकार का जोर (या टाइप कास्टिंग) कहा जाता है।
चूंकि जावास्क्रिप्ट एक कमजोर टाइप की भाषा है, इसलिए मूल्यों को विभिन्न प्रकारों के बीच स्वचालित रूप से परिवर्तित किया जा सकता है, और इसे निहित प्रकार का जोर कहा जाता है। यह आमतौर पर होता है जब आप विभिन्न प्रकार की तरह के मूल्यों को ऑपरेटरों लागू
1 == null, 2/’5', null + new Date(), या यह के बारे में संदर्भ द्वारा, साथ की तरह शुरू किया जा सकता if (value) {…}है, जहां मूल्य बूलियन के लिए मजबूर किया जाता है।
एक ऑपरेटर जो निहित प्रकार के जबरदस्ती को ट्रिगर नहीं करता है ===, जिसे सख्त समानता ऑपरेटर कहा जाता है। ==दूसरी ओर ढीला समानता ऑपरेटर जरूरत पड़ने पर दोनों की तुलना और प्रकार की जबरदस्ती करता है।
इम्प्लिक्ट टाइप कोर्सियन एक डबल एज तलवार है: यह हताशा और दोष का एक बड़ा स्रोत है, लेकिन एक उपयोगी तंत्र भी है जो हमें पठनीयता को खोए बिना कम कोड लिखने की अनुमति देता है।
तीन प्रकार का रूपांतरण , जानने का पहला नियम जावास्क्रिप्ट में केवल तीन प्रकार के रूपांतरण हैं:
दूसरे, आदिम और वस्तुओं के लिए रूपांतरण तर्क अलग तरह से काम करता है, लेकिन आदिम और वस्तु दोनों को केवल उन तीन तरीकों से परिवर्तित किया जा सकता है।
आइए पहले आदिम से शुरू करें।
स्ट्रिंग रूपांतरण
स्ट्रिंग में मानों को स्पष्ट रूप से परिवर्तित करने के लिए स्ट्रिंग () फ़ंक्शन को लागू करें। किसी भी ऑपरेंड के स्ट्रिंग होने पर, द्विआधारी + ऑपरेटर द्वारा निहित जोर दिया जाता है:
String(123) // explicit
123 + '' // implicit
सभी आदिम मूल्यों को स्वाभाविक रूप से स्ट्रिंग में बदल दिया जाता है जैसा कि आप उम्मीद कर सकते हैं:
String(123) // '123'
String(-12.3) // '-12.3'
String(null) // 'null'
String(undefined) // 'undefined'
String(true) // 'true'
String(false) // 'false'
प्रतीक रूपांतरण थोड़ा मुश्किल है, क्योंकि इसे केवल स्पष्ट रूप से परिवर्तित किया जा सकता है, लेकिन अंतर्निहित रूप से नहीं।
String(Symbol('my symbol')) // 'Symbol(my symbol)'
'' + Symbol('my symbol') // TypeError is thrown
बूलियन रूपांतरण
एक बूलियन के लिए मान को स्पष्ट रूप से रूपांतरित करने के लिए Boolean()फ़ंक्शन को लागू करें । तार्किक रूपांतरण तार्किक संदर्भ में होता है, या तार्किक ऑपरेटरों ( || && !) द्वारा ट्रिगर किया जाता है ।
Boolean(2) // explicit
if (2) { ... } // implicit due to logical context
!!2 // implicit due to logical operator
2 || 'hello' // implicit due to logical operator
नोट: तार्किक ऑपरेटर जैसे कि || and &&बूलियन रूपांतरण आंतरिक रूप से करते हैं, लेकिन वास्तव में मूल ऑपरेंड का मूल्य वापस करते हैं, भले ही वे बूलियन न हों।
// returns number 123, instead of returning true
// 'hello' and 123 are still coerced to boolean internally to calculate the expression
let x = 'hello' && 123; // x === 123
जैसे ही बूलियन रूपांतरण के केवल 2 संभावित परिणाम होते हैं: सही या गलत, फर्जी मूल्यों की सूची को याद रखना आसान है।
Boolean('') // false
Boolean(0) // false
Boolean(-0) // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(undefined) // false
Boolean(false) // false
किसी भी मूल्य है कि सूची में नहीं है में बदल जाती है trueसहित object, function, Array, Date, उपयोगकर्ता परिभाषित प्रकार, और इतने पर। प्रतीक सत्य मूल्य हैं। खाली वस्तु और सरणियाँ सत्य मान हैं:
Boolean({}) // true
Boolean([]) // true
Boolean(Symbol()) // true
!!Symbol() // true
Boolean(function() {}) // true
संख्यात्मक रूपांतरण
एक स्पष्ट रूपांतरण के लिए बस Number()फ़ंक्शन लागू करें , जैसा आपने किया था Boolean()और String()।
जटिल रूपांतरण मुश्किल है, क्योंकि यह अधिक मामलों में चालू है:
तुलना ऑपरेटरों (>, <, <=,> =)
बिटवाइज़ ऑपरेटर (| & ^ ~)
अंकगणित ऑपरेटर (- + * /%)। ध्यान दें, बाइनरी + संख्यात्मक रूपांतरण को ट्रिगर नहीं करता है, जब कोई भी ऑपरेंड एक स्ट्रिंग है।
एकात्मक + संचालक
ढीला समानता ऑपरेटर == (incl।! =)।
ध्यान दें कि == दोनों ऑपरेंड स्ट्रिंग्स होने पर संख्यात्मक रूपांतरण को ट्रिगर नहीं करता है।
संख्या ('123') // स्पष्ट + '123' // निहित 123! = '456' // निहित 4> '5' // निहित 5 / null // निहित सत्य | 0 // निहित
यहां बताया गया है कि कैसे आदिम मूल्यों को संख्याओं में परिवर्तित किया जाता है:
Number(null) // 0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0
Number(" 12 ") // 12
Number("-12.34") // -12.34
Number("\n") // 0
Number(" 12s ") // NaN
Number(123) // 123
var str = 'dude';
console.log(typeof str); // "string"
console.log(!str); // false
console.log(typeof !str); // "boolean"
एक वैरिएबल का उदाहरण जो शुरू में एक स्ट्रिंग के रूप में घोषित किया जाता है, बूलियन मान में साथ दिया जाता है! ऑपरेटर
टाइप कॉर्किशन एक प्रकार से दूसरे में मान को परिवर्तित करने की प्रक्रिया है (जैसे स्ट्रिंग से नंबर, ऑब्जेक्ट टू बूलियन, और इसी तरह)। किसी भी प्रकार, यह आदिम या एक वस्तु हो, प्रकार के जबरदस्ती के लिए एक वैध विषय है। याद करने के लिए, आदिम हैं: संख्या, स्ट्रिंग, बूलियन, अशक्त, अपरिभाषित + प्रतीक (ईएस 6 में जोड़ा गया)।
प्रकार बलपूर्वक स्पष्ट और अंतर्निहित हो सकता है।
जब कोई डेवलपर उचित कोड लिखकर, संख्या (मान) जैसे प्रकारों के बीच कनवर्ट करने का इरादा व्यक्त करता है, तो इसे स्पष्ट प्रकार का ज़बरदस्ती (या टाइप कास्टिंग) कहा जाता है।
चूंकि जावास्क्रिप्ट एक कमजोर टाइप की भाषा है, इसलिए मूल्यों को विभिन्न प्रकारों के बीच स्वचालित रूप से परिवर्तित किया जा सकता है, और इसे निहित प्रकार का जोर कहा जाता है। यह आमतौर पर तब होता है जब आप विभिन्न प्रकारों के मानों को लागू करते हैं, जैसे 1 == अशक्त, 2 / '5', अशक्त + नई तिथि (), या इसे आसपास के संदर्भ द्वारा ट्रिगर किया जा सकता है, जैसे कि यदि (मान) {... }, जहां मूल्य बूलियन के लिए मजबूर है।
यहाँ अंतर्निहित प्रकार के जबरदस्ती के लिए कुछ उदाहरण दिया गया है:
true + false
12 / "6"
"number" + 15 + 3
15 + 3 + "number"
[1] > null
"foo" + + "bar"
'true' == true
false == 'false'
null == ''
!!"false" == !!"true"
[‘x’] == ‘x’
[] + null + 1
[1,2,3] == [1,2,3]
{}+[]+{}+[1]
!+[]+[]+![]
new Date(0) - 0
new Date(0) + 0
और पढ़ें: https://www.freecodecamp.org/news/js-type-coercion-explained-27ba3d9a2839/
(true == 1) => true/(true === 1) => false।