जावास्क्रिप्ट के अलावा किसी भी अन्य भाषा में ब्रेस स्टार्ट स्थानों (एक ही पंक्ति और अगली पंक्ति) के बीच अंतर है?


91

आज, जब मैं बेतरतीब ढंग से जावास्क्रिप्ट पैटर्न ओ'रिली किताब पढ़ रहा था, तो मुझे एक दिलचस्प बात मिली (संदर्भ के लिए पृष्ठ 27)।

जावास्क्रिप्ट में, कुछ मामलों में, ब्रेस स्टार्ट लोकेशन अलग होने पर अंतर होता है।

function test_function1() {
    return
    {
        name: 'rajat'
    };
}

var obj = test_function1();
alert(obj);  //Shows "undefined"

जबकि

function test_function2() {
    return {
        name: 'rajat'
    };
}

var obj = test_function2();
alert(obj); //Shows object

JSfiddle डेमो

क्या किसी अन्य भाषा में ऐसा व्यवहार है? यदि ऐसा है, तो मुझे अपनी आदत को सुनिश्चित करना होगा .. :)

मैं मुख्य रूप से PHP, C, C ++, Java और रूबी के बारे में चिंतित हूँ।


1
क्रोम और IE9 में पुन: प्रस्तुत, अच्छी पकड़: P
गिदोन

4
सफेद अंतरिक्ष संवेदनशीलता काम करने के लिए बनाई जा सकती है --- अजगर या लाइन मोड फोरट्रान को देखें --- लेकिन सूक्ष्म सफेद अंतरिक्ष संवेदनशीलता शैतान का काम है। गाह! यह बनाने के रूप में बुरा है!
dmckee --- पूर्व-संचालक बिल्ली का बच्चा

यह प्रभावशाली है! अच्छा लगा!
CheckRaise

अब मैं जानना चाहता हूं कि जावास्क्रिप्ट इस तरह से व्यवहार क्यों करता है।
CheckRaise

4
@CheckRaise: मैं यहाँ नियमों का पालन करता हूँ: blogs.msdn.com/b/ericlippert/archive/2004/02/02/…
एरिक

जवाबों:


53

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

>>> def foo():
...   return
...   { 1: 2 }
... 
>>> def bar():
...   return { 1: 2 }
... 
>>> foo()
>>> bar()
{1: 2}

आप Visual Basic में एक समान मामले का निर्माण करने में सक्षम हो सकते हैं, लेकिन मेरे सिर के ऊपर से मैं यह पता नहीं लगा सकता कि VB बहुत प्रतिबंधात्मक है जहां मूल्यों को रखा जा सकता है। लेकिन निम्नलिखित कार्य करना चाहिए, जब तक कि स्थिर विश्लेषक अप्राप्य कोड के बारे में शिकायत न करे:

Try
    Throw New Exception()
Catch ex As Exception
    Throw ex.GetBaseException()
End Try

' versus

Try
    Throw New Exception()
Catch ex As Exception
    Throw
    ex.GetBaseException()
End Try

जिन भाषाओं का आपने उल्लेख किया है, रूबी पास उसी संपत्ति है। PHP, C, C ++ और Java केवल इसलिए नहीं कि वे व्हॉट्सएप के रूप में न्यूलाइन को त्याग देते हैं, और बयान बयान करने के लिए अर्धविराम की आवश्यकता होती है।

यहाँ रूबी में पायथन उदाहरण से समान कोड है:

>> def foo
>>   return { 1 => 2 }
>> end
=> nil
>> def bar
>>   return
>>   { 1 => 2 }
>> end
=> nil
>> foo
=> {1=>2}
>> bar
=> nil

2
आपका वीबी उदाहरण काफी हद तक महत्वपूर्ण नहीं है क्योंकि वीबी कभी भी एक बयान को कई लाइनों को फैलाने की अनुमति नहीं देता है जब तक कि आप लाइन-निरंतरता अनुक्रम "_" का उपयोग नहीं करते हैं।
21

2
ठीक है, मैं पिछली टिप्पणी को वापस लेता हूं क्योंकि मैंने सिर्फ कल्पना पर ध्यान दिया कि कुछ संदर्भ हैं जिनमें VB.NET अंतर्निहित लाइन निरंतरता का समर्थन करता है। मुझे संदेह है कि कोई भी अनुभवी VB प्रोग्रामर इस उदाहरण को "गेटा" समझेगा, हालाँकि, क्योंकि यह बहुत स्पष्ट है Throwऔर ex.GetBaseException()अलग-अलग तार्किक रेखाएँ हैं। अधिक विशेष रूप से, क्योंकि बेसिक ऐतिहासिक रूप से अपने बयानों को सीमांकित करने के लिए लाइनों का उपयोग करता है, एक "गेटचा" अधिक संभावना एक ऐसी स्थिति होगी जहां एक प्रोग्रामर सोचता है कि उसने एक नई तार्किक लाइन पर एक नया बयान बनाया है, लेकिन नहीं।
22

@ फॉग ट्रू, यह बिल्कुल नहीं है।
कोनराड रुडोल्फ

40

जावास्क्रिप्ट दुभाषिया स्वचालित रूप से एक जोड़ता है ; से प्रत्येक पंक्ति के अंत में यदि यह एक नहीं मिलता है (कुछ अपवादों के साथ, यहां उन्हें नहीं मिला :)।

तो मूल रूप से यह मुद्दा ब्रेसिज़ का स्थान नहीं है (जो यहां एक वस्तु शाब्दिक है, न कि अधिकांश भाषाओं में एक कोड ब्लॉक के रूप में), लेकिन यह छोटा "फीचर" जो आपके पहले उदाहरण को return ;=> के लिए मजबूर करता है undefined। आप ES5 कल्पना में व्यवहार की जांच कर सकते हैंreturn

अन्य भाषाओं के लिए जो समान व्यवहार रखते हैं, कोनराड के उत्तर को देखें


5
अत्यधिक उत्कीर्ण उत्तर, फिर भी यह वास्तव में गलत है, क्षमा करें। स्पष्टीकरण अच्छा है लेकिन कृपया गलती सुधारें।
कोनराड रुडोल्फ

जावास्क्रिप्ट के बारे में हिस्सा गलत नहीं है, यह जिस तरह से व्यवहार करता है वह अर्धविराम सम्मिलन के कारण होता है जो undefinedवापस लौटने के लिए मजबूर करता है। मैं के साथ उपसर्ग अन्य भाषाओं के बारे में थोड़ा लिखा afaik , तो एक अलग नज़रिए :) उसे अपने साथ ले।
एलेक्स क्रिमिनियन

5
लेकिन यह सच नहीं है कि जेएस एक अर्धविराम "प्रत्येक पंक्ति के अंत में" "कुछ अपवादों के साथ" सम्मिलित करता है; बल्कि, यह आमतौर पर एक अर्धविराम नहीं डालता है, और केवल कुछ मामले हैं जहां यह करता है । यही कारण है कि यह बहुत सारे गोच का कारण बनता है।
बरबाद

26

सबसे निश्चित रूप से। Google की गो प्रोग्रामिंग भाषा बहुत ही समान व्यवहार (विभिन्न प्रभावों के साथ) प्रदर्शित करती है। जैसा कि वहां बताया गया है:

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

..snip ...

यह दृष्टिकोण क्लीन-लुकिंग, सेमीकोलन-मुक्त कोड के लिए बनाता है। एक आश्चर्य की बात यह है कि एक निर्माण के शुरुआती ब्रेस को रखना महत्वपूर्ण है जैसे कि एक ही लाइन पर स्टेटमेंट अगर; यदि आप नहीं करते हैं, तो ऐसी परिस्थितियां हैं जो गलत परिणाम नहीं दे सकती हैं या नहीं दे सकती हैं। भाषा कुछ हद तक ब्रेस स्टाइल को मजबूर करती है।

गुप्त रूप से, मुझे लगता है कि रोब पाइक केवल एक ट्रू ब्रेस स्टाइल की आवश्यकता के लिए एक बहाना चाहता था।


10
कूल, इस बारे में नहीं जानते थे :)। व्यक्तिगत रूप से, मुझे नहीं लगता कि स्वचालित अर्धविराम प्रविष्टि एक अच्छा विचार है। यह सूक्ष्म बगों को पेश कर सकता है जो भाषा के साथ अनुभवहीन लोगों के लिए एक कठिन समय होगा। यदि आप सेमीकोलन मुक्त कोड लिखना चाहते हैं, तो मुझे अजगर तरीका पसंद है।
एलेक्स कॉमिनियन

@ किसी भी अर्धविराम (VB) के बिना भी भाषाओं में यह संपत्ति है। और ऐसा ही पायथन करता है, जिसे आप स्पष्ट रूप से पसंद करते हैं, भले ही यह जावास्क्रिप्ट के लिए इस पहचान को संभालता है।
कोनराड रुडोल्फ

मैं अपवोट करूंगा, सिवाय इसके कि आपका दूसरा वाक्य पूरी तरह से गलत है कि यह मुझे नीचा दिखाना चाहता है। मुझे लगता है कि वे रद्द करते हैं। ;-)
बर्बाद करें

1
@ruakh क्या आपका मतलब है "गो इस बिलकुल ठीक है" या क्या आप लूट के पाइक के बारे में मज़ाक कर रहे थे? पूर्व के मामले में, मैं "एक ही व्यवहार को प्रदर्शित करने के लिए जा सकता हूं", बाद के दिनों में, मुझे खेद है कि अगर मेरी अपमानजनक भावना का दोष है;)
डेव

1
मेरा मतलब है "जाओ ठीक यही करता है।" गो के अर्धविराम सम्मिलन का मूल प्रस्ताव स्पष्ट रूप से जावास्क्रिप्ट के साथ ही विपरीत है, यह समझाते हुए, "यह प्रस्ताव आपको जावास्क्रिप्ट के वैकल्पिक अर्धविराम नियम की याद दिला सकता है, जो प्रभावी रूप से पार्स त्रुटियों को ठीक करने के लिए अर्धविराम जोड़ता है। गो प्रस्ताव गहरा अलग है", और वह यह है कि। हर स्तर पर यह बिल्कुल सही है: यह अलग तरह से काम करता है, इसके अलग-अलग प्रभाव होते हैं, और इसका कोई आधार नहीं है। (OTBS- प्रवर्तन, कष्टप्रद है, क्योंकि यह गो कोड में एक सुसंगत आवश्यकता है, क्योंकि एक
गोच नहीं है

14

उस प्रश्न का उत्तर काफी आसान है। किसी भी भाषा में "स्वचालित अर्धविराम सम्मिलन" उस रेखा पर मुसीबत में हो सकता है। इससे समस्या हुई

return
{
     name: 'rajat'
};

..इसलिए कि js इंजन return;स्टेटमेंट (और इसलिए वापसी undefined) के बाद एक अर्धविराम सम्मिलित करेगा । यह उदाहरण घुंघराले ब्रैकेट को हमेशा दाईं ओर खोलने का एक अच्छा कारण है और कभी भी बाईं ओर भी नहीं। चूंकि आप पहले से ही सही ढंग से ध्यान देते हैं, अगर एक ही पंक्ति में एक घुंघराले ब्रैकेट है, तो व्याख्याकार यह नोटिस करेगा कि और एक अर्धविराम नहीं डाल सकता है।


6

FWIW, JSLint ने उस वाक्य रचना के साथ कई चेतावनियों की रिपोर्ट की:

$ jslint -stdin
function foo(){
  return
  { x: "y" };
}
^D
(3): lint warning: unexpected end of line; it is ambiguous whether these lines are part of the same statement
  return
........^

(3): lint warning: missing semicolon
  { x: "y" };
..^

(3): lint warning: unreachable code
  { x: "y" };
..^

(3): lint warning: meaningless block; curly braces have no impact
  { x: "y" };
..^

(3): lint warning: use of label
  { x: "y" };
.....^

(3): lint warning: missing semicolon
  { x: "y" };
...........^

(3): lint warning: empty statement or extra semicolon
  { x: "y" };
............^


0 error(s), 7 warning(s)

1

पहली भाषा जहां मैं इस पर आया था वह awk था (जिसमें सिंटैक्स "विषमताओं" का भी हिस्सा है; वैकल्पिक अर्ध कॉलन, स्ट्रिंग कॉन्फैटेनेशन केवल व्हाट्सएप का उपयोग करके और इसी तरह ...) मुझे लगता है कि डीट्रेस डिजाइनर, जो डी सिंटैक्स शिथिल आधारित है। जागने पर, इन विशेषताओं को कॉपी न करने के लिए पर्याप्त समझ थी, लेकिन मैं अपने सिर के ऊपर से याद नहीं कर सकता। एक सरल उदाहरण (मेरे मैक से DTD में ENTITY टैग की संख्या गिनना):

$ cat printEntities.awk 
# This prints all lines where the string ENTITY occurs
/ENTITY/ {
  print $0
}
$ awk -f printEntities.awk < /usr/share/texinfo/texinfo.dtd | wc -l
     119

यदि इसके बजाय यह छोटी लिपि खुद की एक पंक्ति पर ब्रेस के साथ लिखी गई थी, तो यह होगा:

$ cat printAll.awk 
# Because of the brace placement, the print statement will be executed
# for all lines in the input file
# Lines containing the string ENTITY will be printed twice,
# because print is the default action, if no other action is specified
/ENTITY/
{ 
   print $0 
}
$ awk -f printAll.awk < /usr/share/texinfo/texinfo.dtd | wc -l
     603
$ /bin/cat < /usr/share/texinfo/texinfo.dtd | wc -l
     484
$ 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.