क्या जावास्क्रिप्ट एक अप्रकाशित भाषा है?


104

मैंने पाया है कि कुछ लोग जावास्क्रिप्ट को "गतिशील, कमजोर रूप से टाइप की गई" भाषा कहते हैं, लेकिन कुछ "अनकैप्ड" भी कहते हैं? यह वास्तव में कौन सा है?

जवाबों:


133

जावास्क्रिप्ट है untyped:


(स्रोत: no.gd )

यहां तक ​​कि ब्रेंडन ईच भी ऐसा कहते हैं। ट्विटर पर उन्होंने इस सवाल से जुड़े एक सूत्र का जवाब दिया:

... अकादमिक प्रकार का उपयोग "अनकैप्ड" का अर्थ है "कोई स्थिर प्रकार नहीं" ...

तो समस्या यह है कि अनकही की कुछ अलग परिभाषा है ।

उपर्युक्त उत्तरों में से एक में एक परिभाषा के बारे में बात की गई है - रनटाइम मूल्यों को टैग नहीं करता है और बस प्रत्येक मूल्य को बिट्स के रूप में मानता है। जावास्क्रिप्ट टैग को मान देता है और उन टैग के आधार पर अलग व्यवहार करता है । तो जावास्क्रिप्ट स्पष्ट रूप से इस श्रेणी में फिट नहीं है।

दूसरी परिभाषा प्रोग्रामिंग लैंग्वेज थ्योरी (ब्रेंडन का जिक्र करने वाली अकादमिक बात) से है। इस डोमेन में, अनकैप्ड का अर्थ है कि सब कुछ एक ही प्रकार का है

क्यों? क्योंकि एक भाषा केवल एक कार्यक्रम उत्पन्न करेगी जब यह साबित हो सकता है कि प्रकार संरेखित करें (उर्फ करी-हावर्ड संवाददाता ; प्रकार प्रमेय हैं, कार्यक्रम प्रमाण हैं)। इसका अर्थ अनपेक्षित भाषा में है:

  1. एक कार्यक्रम हमेशा उत्पन्न होता है
  2. इसलिए प्रकार हमेशा मेल खाते हैं
  3. इसलिए केवल एक प्रकार का होना चाहिए

एक टाइप की गई भाषा के विपरीत:

  1. एक कार्यक्रम उत्पन्न नहीं किया जा सकता है
  2. क्योंकि प्रकार मेल नहीं खा सकते हैं
  3. क्योंकि एक प्रोग्राम में कई प्रकार हो सकते हैं

इसलिए आप पीएलटी में जाएं, अनकैप्ड का अर्थ है डायनेमिक रूप से टाइप किया गया और टाइप किया हुआ बस स्टैटिकली टाइप किया हुआ है । जावास्क्रिप्ट इस श्रेणी में निश्चित रूप से अप्रकाशित है।

यह सभी देखें:


6
और हां, "नो स्टैटिक टाइप्स" "नो टाइप्स अनाउंसमेंट्स" के समान नहीं है।
एंड्रियास रॉसबर्ग

+1। आप शायद यह भी लिंक करना चाहिए इस आपका जवाब में। यह "कमजोर रूप से टाइप किया गया" bs बहुत व्यापक है।
लापता '11

2
प्रोग्रामिंग भाषा सिद्धांत सही है। विशाल स्क्रीनशॉट गलत है।
एलेक्स डब्ल्यू

2
मुझे यह देखकर खुशी हुई कि इस उत्तर ने हार्पर के ब्लॉग पोस्ट को संदर्भित किया, लेकिन यह अच्छा होगा यदि PLT समुदाय ने "बिना पढ़े" के पक्ष में "अनकैप्ड" गिरा दिया। "अनकैप्ड" अर्थ "जस्ट बिट्स" की परिभाषा वास्तव में समझ में आती है। ऐसी भाषा का वर्णन करने के लिए "अप्रयुक्त" का उपयोग करने के लिए जिसका औपचारिक विनिर्देश "प्रकार" शब्द का उपयोग करता है और कहता है कि इसके सात प्रकार हैं (अपरिभाषित, अशक्त, संख्या, स्ट्रिंग, बूलियन, प्रतीक और वस्तु) वास्तव में भ्रामक है। अधिकांश लोग पीएलटी के प्रकार से इस धारणा को अलग नहीं करना चाहते हैं।
रे तोल

4
बिना 1. 2. 3.पढ़ी हुई भाषा के लिए आपकी भाषा जावास्क्रिप्ट से मेल नहीं खाती। वहाँ नहीं है केवल एक प्रकार - कि कैसे प्रदर्शित करता है जावास्क्रिप्ट untyped है 5. तो - 4 के बारे में देखते हैं?
डॉन चेडल

82

मजबूत / कमजोर के संबंध में सोचा जा सकता है कि संकलक, यदि लागू हो, टाइपिंग को संभालता है।

  • कमजोर टाइप का अर्थ है कि कंपाइलर, यदि लागू हो, तो सही टाइपिंग को लागू नहीं करता है। अंतर्निहित संकलक अवरोध के बिना, निर्देश रन-टाइम के दौरान त्रुटि करेगा।

    "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

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

यदि कोई दावा करता है कि जावास्क्रिप्ट अनटाइप्ड है, तो यह केवल अकादमिक सिद्धांत के लिए है, व्यावहारिक अनुप्रयोग के लिए नहीं।


1
लेकिन मुझे लगता है कि अंतिम वक्तव्य में विरोधाभास है। जावास्क्रिप्ट में, पूर्णांक-स्ट्रिंग विभाजन का परिणाम पूर्णांक या स्ट्रिंग के किसी भी मूल्य के लिए अच्छी तरह से परिभाषित है। यह सिर्फ बहुत उपयोगी नहीं है!
डेनिज डोगन

यदि आपके पास एक बेहतर परिभाषा / विवरण है, तो इसे संपादित करने के लिए स्वतंत्र महसूस करें। इसलिए मैंने इसे सामुदायिक विकि बना दिया।
गम्बू

@skurpur: आपने डायनामिक और कमजोर टाइपिंग के अर्थों की पूरी तरह से अदला-बदली कर ली है।
रेने सरसो

ओह, क्षमा करें, आपने इसे संपादित किया है मैं इसे संपादित भी कर रहा था और मैंने आपके परिवर्तनों को ओवरराइड किया।
रेने सारसो

3
-1। आप पढ़ने की जरूरत है इस
12:56

48

जावास्क्रिप्ट कमजोर रूप से टाइप किया गया है । यह निश्चित रूप से "अप्रकाशित" नहीं है, लेकिन इसकी कमजोर टाइप की प्रकृति निहितार्थ के संदर्भ में बहुत अधिक लचीलेपन की अनुमति देती है।

ध्यान रखें कि जावास्क्रिप्ट भी गतिशील रूप से टाइप किया गया है। टाइप करने की यह विधि अनुमति देती है कि "डक टाइपिंग" के रूप में क्या जाना जाता है ।

तुलना के लिए विचार करें कि जावास्क्रिप्ट दृढ़ता से टाइप नहीं है और न ही यह सांख्यिकीय रूप से टाइप किया गया है। कभी-कभी यह समझना कि कुछ ऐसा नहीं है जो आपको यह देखने में मदद कर सके कि यह क्या है।


2
-1। आप पढ़ने की जरूरत है इस
लापता हो

3
यह उत्तर शीर्ष मतदान की तुलना में बहुत बेहतर है, और बहुत अधिक सटीक है।
एलेक्स डब्ल्यू

3
@JimboJonny: सही नहीं है। जब तक एक विधानसभा देव की उपस्थिति में, यह बताना गलत नहीं होगा कि हर भाषा टाइप की जाती है। अनपिपड का अर्थ है केवल संचालन सीधे बिट हेरफेर पर। लेकिन विचार करें कि जावास्क्रिप्ट में स्ट्रींग () और पार्सइंट () तरीके हैं। इससे अधिक टाइप न करें।
सुमेर ५

2
@Suamere - यहाँ O'Reilly से "Javascript: द डेफिनिटिव गाइड" का एक उद्धरण दिया गया है : "जावा और C जैसी जावास्क्रिप्ट और भाषाओं के बीच एक महत्वपूर्ण अंतर यह है कि जावास्क्रिप्ट अनकैप्ड है। इसका मतलब है, भाग में, कि जावा या चर के विपरीत, जावास्क्रिप्ट चर किसी भी डेटाटाइप का मान रख सकता है, जो केवल एक विशेष प्रकार के डेटा को पकड़ सकता है, जिसके लिए यह घोषित किया गया है। "
जिम्बो जॉनी

3
इसलिए यदि आप बीएस में खरीदते हैं तो कुछ दोस्त दावा करते हैं कि अकादमिक लोग जानबूझकर "अनपेड" ​​शब्द का इस्तेमाल करते हैं, जिसका अर्थ है "गतिशील रूप से टाइप किया गया।" फिर, आपके सभी प्रमाणों से जावास्क्रिप्ट अप्रकाशित है। लेकिन अगर आप जानते हैं कि "अनकैप्ड" का उपयोग गलत तरीके से उन भाषाओं का प्रतिनिधित्व करने के लिए किया जाता है जो वास्तव में "गतिशील रूप से टाइप की जाती हैं", तो बस खतरे वाली भाषाओं को "गतिशील रूप से टाइप किया गया" कहें। tinyurl.com/czhcv54
Suamere

8

लेखक की बात के लिए जावास्क्रिप्ट को डायनामिक टाइप के रूप में भी वर्गीकृत किया गया है । विकी बताता है कि डायनामिक टाइप की गई भाषाओं को एक संकलक के बजाय रनटाइम पर टाइप किया जाता है जबकि कमजोर टाइप आपके कोड में मक्खी पर टाइप बदलने की क्षमता को संदर्भित करता है। तो हाँ, यह डायनामिक टाइप और कमजोर टाइप दोनों है।


6

यहाँ समस्या यह है कि बहुत सारे प्रोग्रामर्स को भ्रमित कर रहा है कि कहीं इस तरह की परिभाषाएँ मानकीकृत नहीं हैं। अप्रयुक्त प्रोग्रामिंग भाषा शब्द अस्पष्ट है। क्या यह उस भाषा को संदर्भित करता है, जिसमें कोई डेटा प्रकार नहीं है या एक भाषा जो लंबो कैलकुलस अनटाइप्ड वेरिएंट है ?

जावास्क्रिप्ट / 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अपने कोड के निष्पादन के दौरान अपवाद मिलते हैं। यहाँ उदाहरण है

मुझे लगता है कि शीर्ष-मतदान जवाब जावास्क्रिप्ट फ़ंक्शंस के बहुरूपता को उन कार्यों के साथ भ्रमित कर रहा है जो शाब्दिक रूप से कुछ भी स्वीकार करेंगे (जैसा कि लैम्ब्डा कैलकुलस के अप्रकाशित वेरिएंट के साथ) जो एक एसोसिएशन फालसी है


यह एक मिथ्या नाम नहीं है, लेकिन संदर्भ मायने रखता है, देखें stackoverflow.com/questions/9154388/…
एंड्रियास रॉसबर्ग

@AndreasRossberg यह पूरी तरह है एक मिथ्या नाम। आपके बेशर्म स्व-प्रवर्तित लिंक में आप जो उल्लेख करते हैं , वह एक प्रकार की प्रणाली है। शब्द एक मिथ्या नाम है क्योंकि यह अस्पष्ट है। अधिकांश प्रोग्रामर सोचते हैं कि डेटा प्रकार टाइप सिस्टम नहीं है जब वे एक अनकही भाषा के बारे में सुनते हैं । मुझे लगता है कि कोनराड रूडोफ की टिप्पणी वास्तव में इस बिंदु को घर ले जाती है।
एलेक्स डब्ल्यू

यकीन नहीं है कि आप इसे यहाँ दोहराने के बजाय मेरे पिछले जवाब को संदर्भित करने के लिए "बेशर्म" क्यों पाते हैं। इसके अलावा, मैंने स्पष्ट रूप से संदर्भ मामलों को कहा। के। रूडोल्फ की शिकायत के विपरीत, साहित्य में "प्रकार प्रणाली" की पूरी तरह से सुसंगत और व्यापक रूप से स्वीकृत परिभाषाएं हैं, और मैं एक उद्धरण देता हूं। बेशक, आप उन्हें अपने संदर्भ में भ्रमित करने के लिए स्वतंत्र हैं, लेकिन यह उन्हें "गलत" नहीं बनाता है।
एंड्रियास रॉसबर्ग

@AndreasRossberg प्रसंग यहाँ बहुत महत्वपूर्ण है। शीर्ष-मतदान जवाब में कहा गया है "अप्रकाशित = कोई प्रकार की घोषणा नहीं" जो स्पष्ट रूप से गलत है। मैं जो कह रहा हूं, वह इस संदर्भ में एक मिथ्या नाम है। यहाँ किसी ने लंबोदर कलन का उल्लेख नहीं किया है और ऐसा करना इस सरल मामले में कुछ दिखावा है।
एलेक्स डब्ल्यू

1

याद रखें कि जावास्क्रिप्ट आपको यह पूछने की अनुमति देता है कि क्या है typeof(your_variable), और प्रकारों की तुलना करें: 5==="5"रिटर्न false। इस प्रकार मुझे नहीं लगता कि आप इसे अप्रमाणित कह सकते हैं।

यह गतिशील रूप से और (के रूप में अनुमानित) कमजोर टाइप किया गया है। आप जानना चाहते हैं कि यह डक टाइपिंग का उपयोग करता है (देखें andrew के लिंक) और OOP प्रदान करता है, हालांकि कक्षाओं और विरासत के बजाय प्रोटोटाइप


वेरिएबल की टाइपिंग का वैल्यू की कास्टिंग से कोई लेना-देना नहीं है। यह चर के लिए प्रकार की घोषणाओं के साथ करना है। जावास्क्रिप्ट के पास इसके लिए एक निर्माण नहीं है, यही कारण है कि इतने कम जावास्क्रिप्ट भी अवधारणा को समझते हैं, और क्यों उनमें से कई चर प्रकार की तुलना या कास्टिंग के साथ कुछ करने के लिए चर टाइपिंग को गलत बताते हैं। JS में आप घोषणा नहीं कर सकते ( String a = "blah";या var a:String = 'blah';टाइप किए गए चर) AT ALL। इसीलिए यह अप्रमाणित है।
जिम्बो जॉनी

0

जबकि यह टाइप किया गया है (आप "टाइपऑफ़ someVar" पूछ सकते हैं और इसका विशिष्ट प्रकार सीख सकते हैं, यह बहुत कमजोर है।

दिया हुआ:

  var a = "5";

आप कह सकते हैं कि एक स्ट्रिंग है। हालाँकि, यदि आप लिखते हैं:

  var b = a + 10;

b 15 के बराबर एक int है, इसलिए एक int की तरह ही कार्य किया जाता है। बेशक, आप तब लिख सकते हैं:

  var c = a + "Hello World";

और c "5Hello World" के बराबर होगा, इसलिए एक फिर से एक स्ट्रिंग की तरह काम कर रहा है।


1) एक मूल्य कास्टिंग! = एक चर 2 टाइप करना) यह कमजोर नहीं है, यह अस्तित्वहीन है। आप जावास्क्रिप्ट में एक चर नहीं टाइप कर सकते हैं।
जिम्बो जॉनी

जिज्ञासावश इस जवाब को दो मत मिले। कमजोर टाइपिंग पर मुझे जो परिभाषा मिली है, वह ठीक यही कहती है: यह कैसे उपयोग किया जाता है, इसके आधार पर मूल्य का प्रकार निर्धारित किया जाता है।
एनियोबे

क्या यह सटीक है? मुझे bबराबर मिलता है 510: ideone.com/BRcSW7
aioobe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.