91

आज, जबकि मैं यादृच्छिक रूप से जावास्क्रिप्ट पैटर्न O'Reilly पुस्तक पढ़ रहा था, मुझे एक दिलचस्प चीज़ मिली (संदर्भ के लिए पृष्ठ 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 Demo

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

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

+1

क्रोम और IE9, अच्छा पकड़ में पुन: निर्मित: पी – gideon

+4

व्हाइट अंतरिक्ष संवेदनशीलता काम करने के लिए --- अजगर या लाइन मोड fortran --- लेकिन * पर नज़र सूक्ष्म * सफेद स्थान संवेदनशीलता का काम है बनाया जा सकता है शैतान। गाह! यह उतना ही बुरा है जितना बनाना! – dmckee

+0

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

उत्तर

53

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

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

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

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, सी, सी ++ और जावा बस इतना नहीं है क्योंकि वे व्हाइटस्पेस के रूप में न्यूलाइन को छोड़ देते हैं, और अर्धविरामों को सीमित करने के लिए अर्धविराम की आवश्यकता होती है।

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

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

+2

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

+0

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

40

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

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

अन्य भाषाओं के लिए समान व्यवहार है, Konrad's answer देखें।

+5

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

+0

जावास्क्रिप्ट के बारे में हिस्सा गलत नहीं है, जिस तरह से यह व्यवहार करता है वह अर्धविराम सम्मिलन की वजह से होता है जो 'अपरिभाषित' को वापस करने के लिए मजबूर करता है। मैंने _afaik_ के साथ prefixed की अन्य भाषाओं के बारे में थोड़ा लिखा, तो इसे नमक के अनाज के साथ ले लो :)। –

+5

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

14

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

return 
{ 
    name: 'rajat' 
}; 

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

26

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

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

..snip ...

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

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

+10

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

+0

@Alex बिना किसी भी * अर्धविराम (वीबी) के बिना भाषाएं भी इस संपत्ति में हैं। और इसलिए पाइथन, जिसे आप स्पष्ट रूप से पसंद करते हैं, भले ही यह जावास्क्रिप्ट को समान रूप से संभालता है। –

+0

मैं ऊपर उठाना चाहता हूं, सिवाय इसके कि आपका दूसरा वाक्य इतना गलत है कि यह मुझे डाउनवोट करना चाहता है। मुझे लगता है कि वे रद्द कर दिया।;-) – ruakh

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 
$ 
संबंधित मुद्दे

 संबंधित मुद्दे