जावास्क्रिप्ट चर परिभाषा: कॉमस बनाम अर्धविराम


88

अर्धविरामों के बजाय चरों के समूह की घोषणा करते समय क्या अंतर और / या फायदे हैं, यदि कोई हो, तो अल्पविराम का उपयोग करना।

उदाहरण के लिए:

var foo = 'bar', bar = 'foo';

बनाम

var foo = 'bar';
var bar = 'foo';

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

जवाबों:


72

कोई प्रदर्शन लाभ नहीं, बस व्यक्तिगत पसंद और शैली की बात है।

पहला संस्करण सिर्फ अधिक रसीला है।


अपडेट करें:

तार पर जा रहे डेटा की मात्रा के संदर्भ में, निश्चित रूप से कम बेहतर है, हालांकि varवास्तविक प्रभाव देखने के लिए आपको बहुत सारे हटाए गए घोषणाओं के एक नरक की आवश्यकता होगी ।

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


8
आपके जावास्क्रिप्ट को छोटा करते समय एक प्रदर्शन लाभ होता है।
रयान किनाल

1
@ रायाण काँल - जहाँ वास्तव में सवाल में आप मीनिंगफुल उल्लेख करते हैं?
ओड

2
@Oded - minification प्रदर्शन की चिंताओं के अनुरूप है। इसलिए, यदि एक शैली खुद को बेहतर minification करने के लिए उधार देती है, तो वह खुद को परोक्ष रूप से प्रदर्शन की चिंताओं के लिए उधार देती है
STW

7
@ रियान: गूगल क्लोजर कंपाइलर की तरह अच्छा मिनिफ़ायर, कई वेरिएंट
डैनियल

2
हाँ आप सही है। जिज्ञासा से बाहर, मैंने एक परीक्षण ( jsperf.com/… ) बनाया, इसे 5 बार चलाया, और 5 अलग-अलग उत्तर मिले। तो, उम, हाँ, यह शैली और व्यक्तिगत पसंद के बारे में है, प्रदर्शन नहीं।
डेरेक हेंडरसन

29

क्रॉकफोर्ड और अन्य लोगों को पढ़ने के बाद, मैंने विशेष रूप से अल्पविराम के साथ अपने चर की श्रृंखला शुरू की। फिर बाद में, मैं वास्तव में Chrome DevTools डीबगर से नाराज हो गया, जो अल्पविराम के साथ परिवर्तनशील परिभाषाओं पर नहीं रुकता था। डीबगर के लिए, अल्पविराम के साथ जंजीर की परिभाषाएं एक एकल कथन हैं, जबकि कई संस्करण स्टेटमेंट कई कथन हैं, जिस पर डिबगर बंद हो सकता है। इसलिए, मैंने पीछे से स्विच किया:

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;

सेवा:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;

अब तक, मैं डिबगर के मुद्दे को हल करने के अपने लाभ का उल्लेख नहीं करने के लिए, दूसरे संस्करण को बहुत क्लीनर पाता हूं।

"वायर के माध्यम से कम कोड" तर्क प्रेरक नहीं है, क्योंकि इसमें मिनिफ़ायर हैं।


1
मैंने वास्तव में स्वयं इसका अनुभव किया है। मैं आमतौर पर केवल घोषणा को विभाजित करता हूं जहां मुझे कुछ की जांच करने की आवश्यकता होती है, और debuggerवहां एक ड्रॉप करता है, फिर एक varऔर जोड़ें और अल्पविराम लगाते रहें। फिर जब मैं डीबगिंग कर लेता हूं तो मैं वापस जाता हूं debuggerऔर अतिरिक्त और हटा देता हूं var
कोलिन क्लोफेनस्टीन

7
दूसरा वेरिएंट गिट हिस्ट्री को भी क्लीनर बनाता है। दूसरे वैरिएबल या जोखिम को जोड़ने से पहले अनुगामी अर्धविराम को अल्पविराम में बदलने के बजाय एक वैश्विक वैरिएबल बनाएं जिसमें आप केवल एक पूर्ण विवरण जोड़ते हैं।
payne8

उल्लेख करने के लिए, पहला रूप गलत तरीके से आपको लगता है कि b या c वैश्विक है।
गार्ग्मे

18

मैं var-per-variableनोटेशन पसंद करता हूँ :

var a = 2
var b = 3

क्योंकि अन्य comma-instead-of-another-varसंकेतन में ये तीन कमियाँ हैं:

1.
इस कोड पर विचार करने के लिए मुश्किल :

var a = 1,
    b = mogrify(2),
    c = 3

लेकिन हे, मोगरिफाई क्या करता है? आइए जानने के लिए बी प्रिंट करें:

var a = 1,
    b = mogrify(2),
    console.log(b)
    c = 3

सामान तोड़ता है

2. पढ़ने में मुश्किल

लाइन के भीख मांगने का संस्करण स्पष्ट रूप से बताता है कि शुरू किया गया एक नया चर होगा।

var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
        unicorn.legs.map((leg) => {
            leg.log('yes')
        })
    }).sort(),
    c = 3

क्या c = 3कर रहा है वहाँ सही है?

3. सुसंगत नहीं

इस पर विचार करो:

var a = 1,
    b = 2,
    c = 3

var-per-variableहर घोषणा के साथ एक ही संरचना का पालन करें। साथ मेंcomma-instead-of-another-varपहले चर के दूसरों की तुलना में अलग तरीके से घोषित किया जाता है। यदि आप निर्णय लेते हैं, कहते हैं, पहले चर को चक्र के अंदर ले जाएँ, तो आपको घोषणाओं के बीच में var जोड़ना होगा

वरीयता के अलावा, ऐसा लगता है कि अधिकांश उल्लेखनीय परियोजनाएं var-per-variableसंकेतन का उपयोग करती हैं


इस बदसूरत शैली के उदाहरण के लिए (अल्पविराम-बजाय-दूसरा-वर) यह कर रहा है और लोगों को भ्रमित कर रहा है, देखें stackoverflow.com/questions/37332155/…
स्कॉट वीवर

7

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

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


6
यह ध्यान देने योग्य मोज़िला जावास्क्रिप्ट (के माध्यम से उस लायक हो सकता है letनिर्माण) करता ब्लॉक गुंजाइश है।
BlackVegetable

3
@BlackVegetable letका उपयोग केवल मोज़िला JS ( यहाँ देखें ) से अधिक में किया जा सकता है । यह ईएस 6 विनिर्देश का हिस्सा है , लेकिन अधिकांश ब्राउज़र अभी भी ईएस 6 की सुविधाओं को लागू करने पर काम कर रहे हैं।
mbomb007

3

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

दूसरी ओर, एक ही लेखक, डगलस क्रॉकफोर्ड , प्रत्येक कोड को अपने कोडिंग सम्मेलनों में अपनी लाइन में लगाने के लिए कहते हैं।varयदि आप इसका उपयोग करते हैं तो आप JSLint में "सभी एक फ़ंक्शन" चेकबॉक्स को अनचेक कर सकते हैं । ;-)


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

2

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

मुझे कई var घोषणाओं से नफरत है इसलिए मैं आमतौर पर करता हूं:

var 
   one
  ,two
  ,three
  ,four
;

जैसा कि यह छोटा और यकीनन अधिक पठनीय है, varदेखने में शोर नहीं है ।


22
"यकीनन" पर कीवर्ड। अगर हम में यह नमूना मिला तो यह var one, two, three four;बहुत जल्दी बन जाएगा । जावास्क्रिप्ट में लाइनों के लिए एक-की-लाइनों को जोड़ना खतरनाक हो सकता है (जेएस दुभाषिए अपने स्वयं के सम्मिलित कर सकते हैं - ;यदि आप यह अनुमान नहीं लगाते हैं तो आप जल्दी से साइड-इफेक्ट पाएंगे। इसके अलावा, ,मुझे बग के लिए अग्रणी बना सकते हैं। , खोजशब्दों को अपनी लाइन मुझे मिल रही है, इस ;पर मुझे अपनी लाइन कीड़े हैं। क्या आप लाइन से भुगतान कर रहे हैं?
STW

8
@STW - आप व्यक्तिगत ब्राउज़र की सनक के अधीन एक यादृच्छिक चीज़ की तरह स्वचालित अर्धविराम प्रविष्टि ध्वनि बनाते हैं, लेकिन वास्तव में यह केवल एक अच्छी तरह से परिभाषित नियमों के अनुसार होता है और आपको चिंता करने की ज़रूरत नहीं है कि इसमें हो सकता है आपकी varघोषणा के बीच में । (हालांकि मैं आपके साथ प्रमुख अल्पविरामों के बारे में सहमत हूं, और varअंतिम अर्धविराम अपनी तर्ज पर है - सभी बग मुझे भी।)
nnnnnn

1
मुझे नहीं लगता कि यह वास्तव में सवाल का जवाब देता है, क्योंकि सवाल व्यक्तिगत पसंद के बारे में नहीं है।
कीथ पिंसन

2

चूंकि मुझे इसका कोई संदर्भ नहीं दिखता है, इसलिए यहां ECMA-262 विनिर्देश का लिंक दिया गया है, जो जावास्क्रिप्ट के लिए अंतर्निहित कल्पना है। उस पृष्ठ का व्याकरण कहता है:

12.2 Variable Statement

Syntax

  VariableStatement :
    var VariableDeclarationList ;

  VariableDeclarationList :
    VariableDeclaration
    VariableDeclarationList , VariableDeclaration

  VariableDeclarationListNoIn :
    VariableDeclarationNoIn
    VariableDeclarationListNoIn , VariableDeclarationNoIn

  VariableDeclaration :
    Identifier Initialiseropt

  VariableDeclarationNoIn :
    Identifier InitialiserNoInopt

  Initialiser :
    = AssignmentExpression
  InitialiserNoIn :
    = AssignmentExpressionNoIn

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


1

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


यह मानता है कि आप अपनी फ़ाइलों को छोटा नहीं कर रहे हैं --- और गंभीरता से, जो इन दिनों अपनी फ़ाइलों को छोटा नहीं करता है?
कीथ पिंसन

1

मैं दूसरा संस्करण पसंद करता हूं (प्रत्येक का अपना है var)। मुझे लगता है कि क्योंकि मैं एक सी ++ पृष्ठभूमि से आता हूं। C ++ में, आप अपने पहले उदाहरण में वैरिएबल घोषित कर सकते हैं, लेकिन यह उस पर आधारित है (यह आसानी से गलतियों की ओर जाता है जब आप उस तरह से पॉइंटर्स बनाने की कोशिश कर रहे हैं)।


1
दिलचस्प बिंदु, लेकिन मुझे यकीन नहीं है कि इस सवाल का जवाब है कि इस जावास्क्रिप्ट सिंटैक्स के वास्तविक फायदे और नुकसान क्या हैं।
कीथ पिंसन

1

यदि आप अपनी जावास्क्रिप्ट को छोटा कर रहे हैं, तो एक बड़ा लाभ है:

var one, two, three, four;

हो जाता है

var a, b, c, d;

जहाँ तक

var one;
var two;
var three;
var four;

हो जाता है

var a;
var b;
var c;
var d;

यह एक अतिरिक्त तीन उदाहरण हैं var, जो समय के साथ जुड़ सकते हैं।

"एक सूची के अलावा" लेख श्रृंखला "बेहतर जावास्क्रिप्ट न्यूनतम" भाग 1 और भाग 2 देखें


6
Google बंद करने वाले कंपाइलर की तरह अच्छे मिनिफ़ायर एक से अधिक var स्टेटमेंट्स को एक में मर्ज करेंगे: img840.imageshack.us/img840/3601/closurecompilerservice.jpg । इसलिए यह तर्क तभी खड़ा होता है जब आप कम स्मार्ट मिनिफायर का उपयोग कर रहे हों ... जो आपको नहीं करना चाहिए :)
डैनियल

2
और अगर आप gzipping कर रहे हैं, तो दोहराया var s सराहनीय रूप से gzipped फ़ाइल का आकार नहीं बढ़ाएगा (यदि मैं सही तरीके से gzipping को समझता हूं)।
पॉल डी। वेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.