मैंने पाया है कि कुछ लोग जावास्क्रिप्ट को "गतिशील, कमजोर रूप से टाइप की गई" भाषा कहते हैं, लेकिन कुछ "अनकैप्ड" भी कहते हैं? यह वास्तव में कौन सा है?
मैंने पाया है कि कुछ लोग जावास्क्रिप्ट को "गतिशील, कमजोर रूप से टाइप की गई" भाषा कहते हैं, लेकिन कुछ "अनकैप्ड" भी कहते हैं? यह वास्तव में कौन सा है?
जवाबों:
जावास्क्रिप्ट है untyped:
(स्रोत: no.gd )
यहां तक कि ब्रेंडन ईच भी ऐसा कहते हैं। ट्विटर पर उन्होंने इस सवाल से जुड़े एक सूत्र का जवाब दिया:
... अकादमिक प्रकार का उपयोग "अनकैप्ड" का अर्थ है "कोई स्थिर प्रकार नहीं" ...
तो समस्या यह है कि अनकही की कुछ अलग परिभाषा है ।
उपर्युक्त उत्तरों में से एक में एक परिभाषा के बारे में बात की गई है - रनटाइम मूल्यों को टैग नहीं करता है और बस प्रत्येक मूल्य को बिट्स के रूप में मानता है। जावास्क्रिप्ट टैग को मान देता है और उन टैग के आधार पर अलग व्यवहार करता है । तो जावास्क्रिप्ट स्पष्ट रूप से इस श्रेणी में फिट नहीं है।
दूसरी परिभाषा प्रोग्रामिंग लैंग्वेज थ्योरी (ब्रेंडन का जिक्र करने वाली अकादमिक बात) से है। इस डोमेन में, अनकैप्ड का अर्थ है कि सब कुछ एक ही प्रकार का है ।
क्यों? क्योंकि एक भाषा केवल एक कार्यक्रम उत्पन्न करेगी जब यह साबित हो सकता है कि प्रकार संरेखित करें (उर्फ करी-हावर्ड संवाददाता ; प्रकार प्रमेय हैं, कार्यक्रम प्रमाण हैं)। इसका अर्थ अनपेक्षित भाषा में है:
एक टाइप की गई भाषा के विपरीत:
इसलिए आप पीएलटी में जाएं, अनकैप्ड का अर्थ है डायनेमिक रूप से टाइप किया गया और टाइप किया हुआ बस स्टैटिकली टाइप किया हुआ है । जावास्क्रिप्ट इस श्रेणी में निश्चित रूप से अप्रकाशित है।
यह सभी देखें:
1. 2. 3.
पढ़ी हुई भाषा के लिए आपकी भाषा जावास्क्रिप्ट से मेल नहीं खाती। वहाँ नहीं है केवल एक प्रकार - कि कैसे प्रदर्शित करता है जावास्क्रिप्ट untyped है 5. तो - 4 के बारे में देखते हैं?
मजबूत / कमजोर के संबंध में सोचा जा सकता है कि संकलक, यदि लागू हो, टाइपिंग को संभालता है।
कमजोर टाइप का अर्थ है कि कंपाइलर, यदि लागू हो, तो सही टाइपिंग को लागू नहीं करता है। अंतर्निहित संकलक अवरोध के बिना, निर्देश रन-टाइम के दौरान त्रुटि करेगा।
"12345" * 1 === 12345 // string * number => number
जोरदार टाइप का मतलब है कि एक संकलक है, और यह आपको स्ट्रिंग से पूर्णांक तक एक स्पष्ट कास्ट करना चाहता है।
(int) "12345" * 1 === 12345
या तो मामले में, कुछ संकलक की विशेषताएं आपके लिए रूपांतरण करने के लिए संकलन-समय के दौरान अनुदेश को स्पष्ट रूप से बदल सकती हैं, यदि यह निर्धारित कर सकती है कि करना सही बात है।
इस प्रकार, जावास्क्रिप्ट को Not-Strong-Typed के रूप में वर्गीकृत किया जा सकता है। इसका मतलब है कि यह कमजोर टाइप या अन-टाइप है।
डायनेमिक / स्टैटिक के संबंध में सोचा जा सकता है कि भाषा निर्देश किस तरह से हेरफेर करते हैं।
डायनामिक टाइप किए गए का अर्थ है कि मूल्य का प्रकार लागू किया गया है, लेकिन चर केवल किसी भी प्रकार के किसी भी मूल्य का प्रतिनिधित्व करता है।
x = 12345; // number
x = "string"; // string
x = { key: "value" }; // object
y = 123 + x; // error or implicit conversion must take place.
वैधानिक रूप से टाइप किए गए साधन का मतलब है कि चर प्रकार दृढ़ता से लागू किया जाता है, और मूल्य प्रकार कम-तो लागू किया जाता है।
int x = 12345; // binds x to the type int
x = "string"; // too late, x is an integer - error
string y = 123; // error or implicit conversion must take place.
इस प्रकार, जावास्क्रिप्ट को नॉट-स्टेटिक-टाइप के रूप में वर्गीकृत किया जा सकता है। इसके अलावा, यह डायनामिक रूप से टाइप किया हुआ प्रतीत होता है, यदि सभी में टाइप किया गया हो। इसलिए हमें यह देखने की जरूरत है कि टाइपिंग का मतलब क्या है।
टाइप का अर्थ है कि भाषा विभिन्न प्रकारों जैसे कि स्ट्रिंग , संख्या , बूलियन , ऑब्जेक्ट , एरे , नल , अपरिभाषित और इसीतरह के बीच अंतरकरती है। इसके अलावा प्रत्येक ऑपरेशन विशिष्ट प्रकारों के लिए बाध्य है। इसलिए आप एक पूर्णांक को एक स्ट्रिंग द्वाराविभाजित नहीं कर सकते।
2 / "blah" // produces NaN
Untyped साधन विभाजित के संचालन पूर्णांक द्वारा स्ट्रिंग के पहले चार बाइट्स के उपचार में परिणाम होगा स्ट्रिंग के रूप में पूर्णांक । इसका कारण यह है कि बिना ऑपरेशन सीधे बिट्स पर होते हैं, अवलोकन करने के लिए कोई प्रकार नहीं हैं। परिणाम कुछ अप्रत्याशित होगा:
2 / "blah" // will be treated as 2 / 1500275048
चूंकि जावास्क्रिप्ट टाइप किए जाने की परिभाषा के अनुसार व्यवहार करता है, यह होना चाहिए। और इसलिए इसे डायनामिक टाइप किया जाना चाहिए, और कमजोर टाइप।
यदि कोई दावा करता है कि जावास्क्रिप्ट अनटाइप्ड है, तो यह केवल अकादमिक सिद्धांत के लिए है, व्यावहारिक अनुप्रयोग के लिए नहीं।
जावास्क्रिप्ट कमजोर रूप से टाइप किया गया है । यह निश्चित रूप से "अप्रकाशित" नहीं है, लेकिन इसकी कमजोर टाइप की प्रकृति निहितार्थ के संदर्भ में बहुत अधिक लचीलेपन की अनुमति देती है।
ध्यान रखें कि जावास्क्रिप्ट भी गतिशील रूप से टाइप किया गया है। टाइप करने की यह विधि अनुमति देती है कि "डक टाइपिंग" के रूप में क्या जाना जाता है ।
तुलना के लिए विचार करें कि जावास्क्रिप्ट दृढ़ता से टाइप नहीं है और न ही यह सांख्यिकीय रूप से टाइप किया गया है। कभी-कभी यह समझना कि कुछ ऐसा नहीं है जो आपको यह देखने में मदद कर सके कि यह क्या है।
लेखक की बात के लिए जावास्क्रिप्ट को डायनामिक टाइप के रूप में भी वर्गीकृत किया गया है । विकी बताता है कि डायनामिक टाइप की गई भाषाओं को एक संकलक के बजाय रनटाइम पर टाइप किया जाता है जबकि कमजोर टाइप आपके कोड में मक्खी पर टाइप बदलने की क्षमता को संदर्भित करता है। तो हाँ, यह डायनामिक टाइप और कमजोर टाइप दोनों है।
यहाँ समस्या यह है कि बहुत सारे प्रोग्रामर्स को भ्रमित कर रहा है कि कहीं इस तरह की परिभाषाएँ मानकीकृत नहीं हैं। अप्रयुक्त प्रोग्रामिंग भाषा शब्द अस्पष्ट है। क्या यह उस भाषा को संदर्भित करता है, जिसमें कोई डेटा प्रकार नहीं है या एक भाषा जो लंबो कैलकुलस अनटाइप्ड वेरिएंट है ?
जावास्क्रिप्ट / ECMAScript में एक प्रकार की प्रणाली है और इसके सभी कार्य डोमेन किसी भी संदर्भ विनिर्देश प्रकार को स्वीकार करेंगे। तो इसका मतलब है कि जावास्क्रिप्ट में वास्तविकता में एकल डेटा प्रकार है। यह कार्यान्वयन का मामला है जो बहुत उन्नत जावास्क्रिप्ट प्रोग्रामर के लिए अधिक महत्वपूर्ण है। औसत जावास्क्रिप्ट प्रोग्रामर केवल अमूर्त भाषा डेटा प्रकारों के बारे में परवाह करता है जिन्हें ECMAScript द्वारा निर्दिष्ट किया गया है।
रोज़मर्रा के प्रोग्रामर के संदर्भ में, शोधकर्ता या सैद्धांतिक कंप्यूटर वैज्ञानिक नहीं, अनकैपिड शब्द एक मिथ्या नाम है क्योंकि ज्यादातर लोग लैम्ब्डा पथरी नहीं कर रहे हैं। इस प्रकार यह शब्द आम जनता को भ्रमित करता है और यह घोषणा करता प्रतीत होता है कि जावास्क्रिप्ट में कोई डेटा प्रकार नहीं है जो कि केवल सच नहीं है। जिसने भी कभी उपयोग किया typeof
है वह जानता है कि जावास्क्रिप्ट का अपना भाषा डेटा प्रकार है:
var test = "this is text";
typeof(test);
पैदावार
"स्ट्रिंग"
ECMAScript भाषा के लिए निम्नलिखित प्रकार परिभाषित करता है: undefined
, null
, string
, boolean
, number
,object
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
जावास्क्रिप्ट के लिए एक अधिक सटीक पदनाम स्पष्ट रूप से टाइप किया जाएगा, गतिशील रूप से टाइप किया जाएगा, या कमजोर / शिथिल टाइप (या इसके कुछ संयोजन), जिसमें जावास्क्रिप्ट कुछ मामलों में प्रकार के जोर का उपयोग करता है जो टाइप को अंतर्निहित करता है क्योंकि आपको स्पष्ट रूप से निर्दिष्ट नहीं करना है आपके चर के प्रकार। यह कमजोर टाइप के अंतर्गत आता है क्योंकि, कुछ भाषाएं जो फ्लोट और पूर्णांक आदि के बीच अंतर करती हैं, के विपरीत, यह number
सभी संख्याओं को समाहित करने के लिए सिर्फ एक प्रकार का उपयोग करती है, और पहले उल्लिखित प्रकार का उपयोग करती है [ECMAScript युक्ति की धारा 9] , इसके विपरीत एक मजबूत दृढ़ता से टाइप की गई भाषा जिसमें बहुत विशिष्ट डेटा प्रकार होंगे (यानी आपको निर्दिष्ट करना होगा int
या float
)।
वैधानिक और गतिशील रूप से टाइप की गई भाषाओं की परिभाषाओं का मानकीकरण नहीं किया गया है, हालाँकि न तो बाइट का आकार था जब कंप्यूटर विकसित होने लगे थे। स्टैटिक और डायनेमिक टाइपिंग सबसे अधिक बार कुछ भाषा सुविधाओं की उपस्थिति को संदर्भित करते हैं। जिनमें से एक रनटाइम पर टाइप-चेकिंग है , या जिसे डायनेमिक टाइप-चेकिंग कहा जाता है । यदि आपने जावास्क्रिप्ट का उपयोग किया है, तो आप पहले से ही जानते हैं कि यह निश्चित रूप से प्रकारों की जांच करने तक इंतजार करता है, यही कारण है कि आपको TypeError
अपने कोड के निष्पादन के दौरान अपवाद मिलते हैं। यहाँ उदाहरण है
मुझे लगता है कि शीर्ष-मतदान जवाब जावास्क्रिप्ट फ़ंक्शंस के बहुरूपता को उन कार्यों के साथ भ्रमित कर रहा है जो शाब्दिक रूप से कुछ भी स्वीकार करेंगे (जैसा कि लैम्ब्डा कैलकुलस के अप्रकाशित वेरिएंट के साथ) जो एक एसोसिएशन फालसी है ।
याद रखें कि जावास्क्रिप्ट आपको यह पूछने की अनुमति देता है कि क्या है typeof(your_variable)
, और प्रकारों की तुलना करें: 5==="5"
रिटर्न false
। इस प्रकार मुझे नहीं लगता कि आप इसे अप्रमाणित कह सकते हैं।
यह गतिशील रूप से और (के रूप में अनुमानित) कमजोर टाइप किया गया है। आप जानना चाहते हैं कि यह डक टाइपिंग का उपयोग करता है (देखें andrew के लिंक) और OOP प्रदान करता है, हालांकि कक्षाओं और विरासत के बजाय प्रोटोटाइप ।
String a = "blah";
या var a:String = 'blah';
टाइप किए गए चर) AT ALL। इसीलिए यह अप्रमाणित है।
जबकि यह टाइप किया गया है (आप "टाइपऑफ़ someVar" पूछ सकते हैं और इसका विशिष्ट प्रकार सीख सकते हैं, यह बहुत कमजोर है।
दिया हुआ:
var a = "5";
आप कह सकते हैं कि एक स्ट्रिंग है। हालाँकि, यदि आप लिखते हैं:
var b = a + 10;
b 15 के बराबर एक int है, इसलिए एक int की तरह ही कार्य किया जाता है। बेशक, आप तब लिख सकते हैं:
var c = a + "Hello World";
और c "5Hello World" के बराबर होगा, इसलिए एक फिर से एक स्ट्रिंग की तरह काम कर रहा है।