पायथन के लाइन-ब्रेक से निपटने का तरीका जावास्क्रिप्ट के स्वचालित अर्धविराम से कैसे भिन्न होता है?


41

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

function test(){
    // This will return 'undefined', because return is a valid statement
    // and  "john" is a valid statement on its own.
    return 
          "john"
}

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

लेकिन पाइथन में कोई भी कभी भी अर्धविराम का उपयोग नहीं करता है और इसके बिल्कुल समान गोचर्स हैं।

def test():
    # This will return 'undefined', because return is a valid statement
    # and  "john" is a valid statement on its own.
    return 
    "john"

ठीक वैसा ही काम करता है, और अभी तक कोई भी अजगर के व्यवहार से घातक नहीं है।

मुझे लगता है कि उन मामलों में जहां जावास्क्रिप्ट बुरा व्यवहार करता है, वे काफी कम हैं कि आप आसानी से उनसे बच सकते हैं। नई लाइन पर वापसी + मान? क्या लोग वास्तव में ऐसा करते हैं?

कोई राय? क्या आप जावास्क्रिप्ट में अर्धविराम का उपयोग करते हैं और क्यों?


3
यह बिल्कुल वैसा ही काम नहीं करता है। सेमीकॉलन सम्मिलन जहां भी जरूरी है, नई जावास्क्रिप्ट में जावास्क्रिप्ट में नहीं जाता है। इस विकिपीडिया पृष्ठ पर दूसरा उदाहरण देखें । अर्धविराम नहीं डाला गया है, जहां उस उदाहरण में नई रेखा है।
रीड

1
मेरी बात यह नहीं थी कि अर्धविरामों का उपयोग करना और उनका उपयोग न करना बिलकुल एक जैसा था, बिंदु यह था कि जावास्क्रिप्ट और अजगर में किनारे के मामले समान थे। निश्चित रूप से कुछ किनारे मामले हैं जहां आपको यह जानना होगा कि क्या हो रहा है। सबसे अच्छा लेख मैंने इस विषय पर पढ़ा है: inimino.org/~inimino/blog/javascript_semicolons
Einar Egilsson

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

3
आप अपने उदाहरणों में मान्य अजगर लिखने पर विचार कर सकते हैं। टिप्पणी सूचक है #, न कि `// '।
हारून डफ़र

2
"स्पष्ट हमेशा निहित से बेहतर है"

जवाबों:


62

इसका कारण यह है कि पायथन में, नई लाइनें कोड लाइनों को अलग करने का एक नायाब तरीका है; यह डिजाइन द्वारा है, और जिस तरह से इस काम को पूरी तरह से सोचा गया है। नतीजतन, पायथन कोड पूरी तरह से पठनीय और बिना किसी विशेष अंत के स्टेटमेंट मार्कर (न्यूलाइन के अलावा) के बिना अस्पष्ट है।

दूसरी ओर, जावास्क्रिप्ट को सी-सी सिंटैक्स को ध्यान में रखते हुए डिज़ाइन किया गया था, जहाँ हमेशा अर्धविराम के साथ बयानों को समाप्त किया जाता है। भाषा को त्रुटियों के प्रति अधिक सहिष्णु बनाने के लिए, यह अनुमान लगाने की कोशिश करता है कि कोड को सही बनाने के लिए अतिरिक्त अर्धविराम कहां जाना चाहिए। चूंकि यह सी-जैसे सिंटैक्स पर रेट्रो-फिट था, यह हमेशा अपेक्षा के अनुरूप काम नहीं करता है (कभी-कभी, स्क्रिप्ट दुभाषिया गलत अनुमान लगाता है), और काफी काउंटर-सहज ज्ञान युक्त कोड के लिए बना सकता है।

या, "स्पष्ट के संदर्भ में बहस करना निहित से बेहतर है": पायथन में, एक नई रेखा पहले से ही पूरी तरह से स्पष्ट है, जबकि जावास्क्रिप्ट में, यह अस्पष्ट है, इसलिए आप इसे स्पष्ट करने के लिए अर्धविराम को जोड़ते हैं।


3
ओह, और आप backquotes का उपयोग करके टिप्पणियों में कोड डाल सकते हैं।
tdammers

1
ऐसे मामले का एक अच्छा उदाहरण जहां स्वचालित अर्ध-बृहदान्त्र सम्मिलन अप्रत्याशित सामान को समाप्त कर देगा: यह है pastebin.com/aVeWGdya
HoLyVieR

5
अजगर में, नियम काफी सरल होते हैं: स्टेटब्रीक पर स्टेटमेंट तब तक समाप्त होते हैं जब तक कि एक अयोग्य मल्टीलाइन स्ट्रिंग ("" ", '' '), एक अनौपचारिक तानाशाही ({}), एक अयोग्य सूची ([]), या एक बैकस्लैश न हो। जावास्क्रिप्ट से पहले। जावास्क्रिप्ट में, नियम काफी अधिक जटिल हैं।
हारून डफौर

5
99% त्रुटियों को कवर करना केवल लोगों को खोजने के लिए वास्तव में कठिन को पीछे छोड़ने का एक अच्छा तरीका है। अजगर में उन्हें पीछे छोड़ना ठीक है क्योंकि 100% समस्याओं को कवर करने वाले आसान नियम हैं।
हारून डफोर

1
@ ऐरन: आप "कोष्ठकों (()) का एक अयोग्य सेट" भूल गए। (कड़ाई से "एक अशुद्ध टुपल नहीं" क्योंकि कोष्ठक केवल टुपल्स के लिए उपयोग नहीं किए जाते हैं।)
JAB

28

मुझे लगता है कि पायथन में काम करने के तरीके से काफी बुनियादी अंतर है। Einar Egilsson को पोस्ट से उद्धृत करते हुए कहा गया है: "एक अर्धविराम को एक पंक्ति के अंत में निहित नहीं किया जाता है यदि बाद की पंक्ति के पहले टोकन को उसी कथन के भाग के रूप में पार्स किया जा सकता है"।

पायथन में एक पंक्ति विराम हमेशा कथन को समाप्त करता है, कुछ स्पष्ट मामलों में जैसे कि एक कोष्ठक अभिव्यक्ति के भीतर। दूसरी ओर जावास्क्रिप्ट, कथन को समाप्त करने से पहले उतनी लाइनों को पार्स करने की कोशिश करेगा, संभवतः इस तरह की चीजों के लिए अग्रणी:

// Define a function and name it area.
area = function(r) {
    return r * r * 3.14159
}

// Fooled you! We're actually invoking it.
(14)

8
अब यहाँ इस एक मजेदार मोड़ है। 14 को किसी चीज़ की तरह बदलें (a + 1) ? do_something() : do_something_else();और अचानक, क्षेत्र वापसी मूल्य पर सेट है do_something()या do_something_else()आप शक्तिशाली रूप से भ्रमित हो गए हैं।
रीड करें

20

मैं अक्सर उत्पादन मोड में अपने JS-Files को कम कर देता हूं। मतलब, टिप्पणियों और लाइनब्रेक को हटाना।

अर्धविराम के उपयोग के बिना, यह मेरी जावास्क्रिप्ट तोड़ देगा।


8
ठीक है, यह मान्य है। लेकिन अगर आपका मिनिमाइज़र एक वास्तविक पार्सर है तो यह उन्हें फिर से आवश्यक रूप से सम्मिलित कर सकता है। या बस लाइनब्रेक को न हटाएं, => आप लाइनब्रेक रखते हैं, अर्धविराम खो देते हैं, वे लगभग एक ही संख्या में होते हैं इसलिए कुछ भी नहीं खोता है।
आइरन एगिल्सन

2
@ ईगनर एगल्सन क्लोजर कंपाइलर वास्तव में ऐसा करता है।
गंभीरदेव

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

3
@ लोगन: यह निश्चित रूप से एक बाइट न्यूलाइन्स मान रहा है ;-)
कैमरून

1
बेशक, अगर हमने जावास्क्रिप्ट के बजाय पायथन का इस्तेमाल किया, तो हमें वही काम करने के लिए WAY को कम करना होगा, इसलिए यह तथ्य कि सेमी-कॉलन इंडेंटेशन से कुछ बाइट्स कम उपयोग करते हैं , एक म्यूट पॉइंट है।
ब्लूराजा - डैनी Pflughoeft

5

यह आपके वर्णन के अनुसार काम नहीं करता है।

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

ये गलत है। उदाहरण:

return
  1 + 2;

1एक पूरी तरह से मान्य टोकन है, लेकिन पार्सर अभी भी एक अर्धविराम को सीधे बाद में सम्मिलित करेगा return

जैसा कि आप देखते हैं, यहां तक ​​कि आप ठीक-ठीक नहीं बता सकते हैं कि अर्धविराम कहां होगा।

स्वचालित प्रविष्टि के साथ समस्या दो गुना है:

  • एक के लिए, लोग अर्धविराम को छोड़ सकते हैं जहां स्वचालित सम्मिलन यह निर्धारित नहीं कर सकता है कि किसी को सम्मिलित करने की आवश्यकता है।
  • इसके अलावा, एक अर्धविराम डाला जा सकता है, जहाँ इसका इरादा नहीं है, जैसा कि ऊपर दिया गया है।

बेशक, प्रत्येक कथन के बाद अर्धविराम का उपयोग करना केवल त्रुटियों के पहले स्रोत के साथ मदद करता है।

किसी भी मामले में, जैसा कि आप अब तक अनुमान लगा सकते हैं, मेरा मानना ​​है कि सी-जैसे सिंटैक्स में स्वचालित अर्धविराम सम्मिलन एक बुरा विचार है।


1
ECMA स्क्रिप्ट कल्पना स्पष्ट रूप से निर्दिष्ट करती है कि कौन से मामले में एक अर्ध-बृहदान्त्र डाला जाएगा, इसलिए आपकी लाइन "आप यह नहीं बता सकते कि अर्धविराम कहां होगा" गलत है। मुद्दा यह है कि यह कुछ मामलों में अचूक है, जिससे किसी ऐसे व्यक्ति को पढ़ाना कठिन हो जाता है जो यह नहीं समझता कि यह कैसे काम करता है।
zzzzBov

1
@zzzzBov: हाँ, एक सटीक विनिर्देश है, लेकिन क्या किसी के पास कोडिंग करते समय वास्तव में सभी मामले हैं? क्या आपको यकीन है? प्रोग्रामर आलसी हैं, और यथायोग्य; वे एक जटिल नियम को याद नहीं रखना चाहते हैं जब कोई बहुत सरल कार्य करेगा। इसलिए वे इसे याद रखने की कोशिश करते हैं।
Svante

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

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

4

मैं एक सरल कारण बताऊंगा:

जावास्क्रिप्ट "थोड़े जावा-ईश" या "थोदा सी-ईश" दिखता है। बेशक यह एक गतिशील भाषा है, इसलिए यह अलग दिखती है ... लेकिन इसका सामना करें - ब्रेसिज़ हैं। ब्रेसिज़ वाली भाषाओं में आमतौर पर अर्धविराम होते हैं। प्राकृतिक सजगता आपकी किक करती है और आपकी उंगली को हिट करने से पहले अर्धविराम कुंजी की ओर जाती है Enter

अजगर, इसके विपरीत, यहां तक ​​कि एक नज़र में बिल्कुल अलग दिखता है। इसलिए, "मानक उबाऊ भाषाओं" के लिए थोड़ा या कोई सादृश्य सहज रूप से नहीं बनता है और जब कोई "पायथन मोड" में प्रवेश करता है, तो अर्धविराम की कमी प्राकृतिक रूप से आती है।


2

जावास्क्रिप्ट में अर्ध-बृहदान्त्र सम्मिलन का उपयोग नहीं करने के कई अच्छे कारण हैं

मुख्य रूप से ऐसा इसलिए है क्योंकि ECMAScript मानक में परिभाषित अर्ध-बृहदान्त्र सम्मिलन कुछ मामलों के लिए अचूक है। @Svante एक ऐसे मामले की ओर इशारा करता है, returnजहाँ नईलाइन के उपयोग से समस्याएँ पैदा होंगी।

वह जो उल्लेख नहीं करता है वह यह है कि यदि आप अर्ध-कॉलन का उपयोग कर रहे हैं तो यह समस्या पैदा करेगा , क्योंकि अर्ध-बृहदान्त्र सम्मिलन होता है कि आप इसे चाहते हैं या नहीं।

अर्ध-बृहदान्त्र सम्मिलन का उपयोग करने का एक और बहुत अच्छा कारण आउटपुट नियंत्रण है। कई मामलों में जावास्क्रिप्ट को उत्पादन में उपयोग किए जाने से पहले एक मिनीफ़ायर के माध्यम से चलाया जाता है। कुछ minifiers स्वत: सेमी-कोलन प्रविष्टि मामलों को संभाल सकता है, लेकिन मैं करने के लिए कोई कारण नहीं देख भरोसा यह पूरी तरह से काम कर रहा पर

इसके अतिरिक्त सामग्री प्रबंधन प्रणालियों के लिए, इनलाइन जावास्क्रिप्ट को स्वत: -सूचित किया जा सकता है, और मैंने कई मामलों को देखा है, जहां प्रत्येक पंक्ति के आरंभ और अंत में ऑटो-माइनर बस टिप्पणियों और ट्रिम्स व्हाट्सएप (न्यूलाइन सहित) को हटा देता है।

उन लेखकों के लिए, जिनके पास इस बात का विकल्प नहीं है कि कौन से उपकरण चुने जा रहे हैं, यह बहुत आसान है कि वे केवल एक प्रारूप से चिपके रहें जो अधिकांश मामलों में काम करता है।


आह, क्षमा करें, लेकिन आपके तीसरे पैराग्राफ के बारे में, मैं इसका उल्लेख अपने दूसरे-से-अंतिम वाक्य में करता हूं। :)
Svante

हां, टूलींग मुद्दा वैध है (हालांकि अच्छे मिनिफायर्स को इसे संभालना चाहिए, जैसे क्लोजर कंपाइलर)। लेकिन मेरी राय में, 'वापसी' उदाहरण जैसी चीजों से बचने के लिए, हमें इन नियमों को वैसे भी जानना होगा। और एक बार जब मुझे नियमों का पता चल जाता है, तो मैं फीचर का उपयोग कर सकता हूं, खासकर जब से यह कोड (IMO) को अधिक पठनीय बनाता है।
ईयरिन एगिल्सन

1

अर्धविराम का उपयोग नहीं करना विफलता का एक नुस्खा है जब आप अपनी फ़ाइलों को जावास्क्रिप्ट फ़ाइलों को छोटा करते हैं। यही वजह है कि मैं इससे डरती हूं।


1

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


1

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

var i = 0

(function() {
   // do something
})()

यह फ़ंक्शन 0के अनाम फ़ंक्शन के साथ फ़ंक्शन को कॉल करने , फिर परिणाम निष्पादित करने के रूप में व्याख्या की जाएगी । इस मामले में आप संभवतः एक असाइनमेंट करना चाहते थे, फिर तुरंत अनाम फ़ंक्शन को निष्पादित करें।

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

(एक तरफ के रूप में: मैं व्यक्तिगत / साइड परियोजनाओं पर काम करते समय अर्धविरामों का उपयोग नहीं करता हूं क्योंकि मुझे पता है कि किसी और को कोड बनाए रखने की आवश्यकता नहीं होगी।)


1

आप की तरह, मुझे लगता है कि यह थोड़ा पागल है। अर्धविराम सम्मिलन के नियमों को जावास्क्रिप्ट में अच्छी तरह से परिभाषित किया गया है, जैसे कि वे पायथन और कॉफीस्क्रिप्ट में हैं। अर्धविराम के साथ कोई भी पाइथन या कॉफ़ीस्क्रिप्ट नहीं देता है, इसलिए जावास्क्रिप्ट को अलग तरह से क्यों माना जाता है?

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

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

जावास्क्रिप्ट को अभी भी अलग तरह से क्यों माना जाता है?

वहां जड़ता है। और यह अनदेखी नहीं की जानी चाहिए कि जो लोग स्पष्ट रूप से संरचित कोड की सराहना करते हैं, वे अक्सर सी-शैली भाषाओं को पसंद करते हैं। जो लोग स्पष्ट रूप से संरचित कोड की सराहना करते हैं, वे अक्सर गैर-सी-शैली भाषाओं (जैसे कॉफीस्क्रिप्ट) पर चले जाते हैं।


0

मैं उन्हें दृढ़ता के लिए जावास्क्रिप्ट में सख्ती से उपयोग करता हूं। अगर ज्यादातर लाइनें हैं

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

मुझे एक ही पंक्ति में कई कथनों के लिए उपयोग नहीं मिल सकता है और इसलिए अर्धविराम का उपयोग करने की उम्मीद नहीं है।


हां, मैंने पायथन का उदाहरण तय किया है। लेकिन बात यह है कि, पायथन में अर्धविराम भी हैं, आपको हर कथन के बाद उन्हें डालने के लिए आपका स्वागत है (और यदि आपके पास प्रत्येक पंक्ति में एक से अधिक हैं तो) लेकिन लोग उनका उपयोग नहीं करते हैं।
आइरन एगिल्सन

0

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


खैर, बड़े तीन, YUI कंप्रेसर, क्लोजर कंपाइलर, और UglifyJS, सभी अर्धविराम सम्मिलन करते हैं। मुझे आश्चर्य नहीं है कि JSMin के रूबी पोर्ट में समस्याएं हैं।
बेंजामिन एटकिन

0

मुझे याद नहीं आ रहा है कि IE का कौन सा सटीक संस्करण है, लेकिन कुछ ऐसे मामले हैं जहां यदि अर्धविराम गायब है तो IE का शाब्दिक रूप से त्रुटि होगी। IIRC ऐसा है जब आपके पास वैश्विक क्षेत्र में कुछ ऐसा है:

var myFunc = function() {
  ...
}

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.