JavaScript में Const: इसका उपयोग कब करना है और क्या यह आवश्यक है?


349

मैं हाल ही constमें जावास्क्रिप्ट में खोजशब्द भर में आया हूँ । मैं जो बता सकता हूं, उसका उपयोग अपरिवर्तनीय चर बनाने के लिए किया जाता है , और मैंने यह सुनिश्चित करने के लिए परीक्षण किया है कि इसे फिर से परिभाषित नहीं किया जा सकता (Node.js में):

const x = 'const';
const x = 'not-const';

// Will give an error: 'constant 'x' has already been defined'

मुझे पता है कि यह अभी तक सभी ब्राउज़रों में मानकीकृत नहीं है - लेकिन मैं केवल Node.js V8 के संदर्भ में दिलचस्पी रखता हूं , और मैंने देखा है कि कुछ डेवलपर्स / प्रोजेक्ट्स को यह बहुत अधिक अनुकूल लगता है जब varकीवर्ड का उपयोग किया जा सकता है। एक ही प्रभाव।

तो मेरे सवाल हैं:

  • जब इसका इस्तेमाल के लिए उपयुक्त है constके स्थान पर var?
  • क्या इसे हर बार इस्तेमाल किया जाना चाहिए जो एक चर नहीं है जिसे फिर से सौंपा जाना है?
  • क्या इसका वास्तव में कोई फर्क पड़ता है अगर varइसका इस्तेमाल किया जाता है constया इसके विपरीत?

1
यह अभी तक मानकीकृत नहीं लगता है (शायद EC6 में?)। आपको इसके बारे में अतिरिक्त जानकारी यहाँ मिलेगी: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
सेबस्टियन सी।

1
कॉन्स्ट ने खराब प्रदर्शन किया हालांकि jsperf.com/const-vs-var-mod-3
दीपू

जवाबों:


462

आपके सवालों के दो पहलू हैं: constइसके बजाय उपयोग करने के तकनीकी पहलू varक्या हैं और ऐसा करने के मानव-संबंधित पहलू क्या हैं।

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

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


4
चीयर्स, मैंने माना कि मोज़िला / गूगल ने बिना किसी कारण के जेएस इंजनों में कास्ट सपोर्ट नहीं जोड़ा है। मैं लागू होने पर कास्ट का उपयोग करना सुनिश्चित करूँगा।
axdg

6
constवस्तुओं को आपस में जोड़ा जा सकता है, इसलिए मुझे यकीन नहीं है कि जेएस कंपाइलर वास्तव में कितना सख्त है। शायद "सख्त उपयोग करें" मोड से भी फर्क पड़ता है।
रुडी

9
@Rudie आप जिस फीचर की तलाश कर रहे हैं उसे ऑब्जेक्ट फ्रीजिंग कहा जाता है । constबस "चर" को दूसरे मूल्य पर पुन: असाइन करने से रोकता है। const a = {}; a = {};सख्त मोड में एक त्रुटि फेंक देगा।
टिबोस

मैं अधिकांश चर के लिए जाने के बजाय सामान्य रूप से कास्ट का उपयोग करता हूं, जैसे कि जावा में मैं सबसे अधिक चर घोषणाओं में अंतिम जोड़ता हूं।
कोडिंग

2
If there is room for error, var should always be used। आज यह लागू नहीं होता है, जैसे ESLint जैसे उपकरण constतुरंत उल्लंघन करते हैं ।
महत्वपूर्ण-

72

2017 अपडेट

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


मूल उत्तर 2014 से

काफी सभ्य ब्राउज़र समर्थन होने के बावजूद , मैं अभी इसके लिए उपयोग करने से बचूंगा। से पर MDN के लेखconst :

Const का वर्तमान कार्यान्वयन एक मोज़िला-विशिष्ट एक्सटेंशन है और ECMAScript 5 का हिस्सा नहीं है। यह फ़ायरफ़ॉक्स और क्रोम (V8) में समर्थित है। सफारी 5.1.7 और ओपेरा 12.00 के रूप में, यदि आप इन ब्राउज़रों में कास्ट के साथ एक चर को परिभाषित करते हैं, तो आप अभी भी बाद में इसके मूल्य को बदल सकते हैं। यह इंटरनेट एक्सप्लोरर 6-10 में समर्थित नहीं है, लेकिन इंटरनेट एक्सप्लोरर 11 में शामिल है। कॉन्स्ट कीवर्ड वर्तमान में फ़ंक्शन स्कोप (जैसे वेरिएबल के साथ घोषित चर) में स्थिर घोषित करता है।

यह तब कहा जाता है:

constECMAScript 6 द्वारा परिभाषित होने जा रहा है, लेकिन विभिन्न शब्दार्थों के साथ। लेट स्टेटमेंट के साथ घोषित किए गए वेरिएबल्स के समान, कॉन्स्टेंट के साथ घोषित किए गए कॉन्स्टेंट ब्लॉक-स्कोप किए जाएंगे।

यदि आप उपयोग करते हैं constतो आपको थोड़े पुराने ब्राउज़रों का समर्थन करने के लिए वर्कअराउंड में जोड़ना होगा।


6
शानदार जवाब - हालाँकि मैं पहले ही एमडीएन पर लेख पढ़ चुका हूँ। जैसा कि मैंने कहा, मुझे इस बात में अधिक दिलचस्पी थी कि क्या वास्तव में V8 वास्तव में कास्ट के भिन्न रूप से इलाज करने वाला था। मुझे लगता है कि @ टिबोस ने सफाई दी।
axdg

जेम्स समर्थन पहलू को इंगित करने के लिए धन्यवाद। imho सभी जावास्क्रिप्ट उत्तर में ब्राउज़र सपोर्ट ब्रेकडाउन शामिल होना चाहिए। अच्छी तरह से समझाया
हबसन ब्रोपा

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

ओपी सवाल Node.js विशिष्ट है
निकु Surdu

@ निकोलासूरू। यह जनवरी 2014 से भी है, इसलिए 2017 में अब शायद ज्यादातर बेमानी है।
जेम्स डोनली

41

का उपयोग करने के लिए क्यों const, @ टिबोस का जवाब शानदार है।

लेकिन तुमने कहा:

मैं जो बता सकता हूं, उसका उपयोग अपरिवर्तनीय चर बनाने के लिए किया जाता है

यह गलत है । वैरिएबल को म्यूट करना पुन: असाइन करने से अलग है:

var hello = 'world' // assigning
hello = 'bonjour!' // reassigning

कास्ट के साथ, आप ऐसा नहीं कर सकते:

const hello = 'world'
hello = 'bonjour!' // error

लेकिन आप अपने चर को बदल सकते हैं:

const marks = [92, 83]
marks.push(95)
console.log(marks) // [92, 83, 95] -> the variable has been mutated.

इसलिए, कोई भी प्रक्रिया जो संकेत का उपयोग किए बिना चर के मूल्य को बदलती है, चर =को बदल रही है।

नोट: +=उदाहरण के लिए ... पुन: असाइन करना है!

var a = 5
a += 2 // is the same as a = a + 2

तो, लब्बोलुआब यह है: constकरने से रोक नहीं करता परिवर्तनशील चर, यह आप से रोकता है फिर से बताए उन्हें।


4
आपका कथन "कोई भी प्रक्रिया जो संकेत का उपयोग किए बिना परिवर्तनशील मूल्य को बदल रही है, =" तकनीकी रूप से गलत है। उदाहरण के लिए, const marks=[92,83]; marks[2]=95; console.log(marks)आउटपुट देगा [92, 83, 95]marksबराबरी के संकेत के माध्यम से, म्यूट कर दिया गया है।
छरवे

5
"लेकिन आपने कहा: << जो मैं बता सकता हूं, इसका उपयोग अपरिवर्तनीय चर बनाने के लिए किया जाता है । यह गलत है । एक चर को म्यूट करना पुन: असाइन करने से अलग है" नहीं, यह नहीं है। Reassigning परिवर्तनशील परिवर्तनशील है। आप जिस ऑब्जेक्ट को वेरिएबल में रेफरेंस को म्यूट करने की बात कर रहे हैं। यह पूरी तरह से एक अलग बात है।
TJ Crowder

यहाँ मिल गया क्योंकि मैं constसरणियों के संदर्भ में समझने की कोशिश कर रहा हूँ (उदाहरण @chharvey का उपयोग किया जाता है)। के मामले में हर बार फिर से असाइन किया है। तो क्यों उपयोग करें और नहीं ? const countArray = countup(n - 1); countArray.push(n);constconstvar
YCode

1
@YCode नं। जब आप का उपयोग करेंconst countArray , तो यह कभी आश्वस्त नहीं होगा। आप अभी भी सरणी पर जोर दे सकते हैं, जो इसके सदस्यों और लंबाई को बदल देता है, लेकिन हम इसे पुन: असाइन नहीं करते हैं। आप constइसके बजाय letया varजब आप पुन: असाइन करना रोकना चाहते हैं, का उपयोग करते हैं। BTW यदि आप पुन: असाइन करने की अनुमति देना चाहते हैं, letतो लगभग हमेशा की तुलना में बेहतर है var
छारवे

@ सच्चरवे धन्यवाद! आपकी प्रतिक्रिया ने मुझे "संदर्भ द्वारा मूल्य बनाम पास से गुजरने" के लिए प्रेरित किया, एक नई अवधारणा, और एक अजीब - जहां मूल्य संशोधन। पुनर्मूल्यांकन। किसी को भी और स्पष्टीकरण की आवश्यकता है, यहाँ जवाबों की जाँच करनी चाहिए: stackoverflow.com/q/46131828/5965865
YCode

38

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

उदाहरण के लिए, तुलना करें:

// Will output 'SECRET'

const x = 'SECRET'
if (x = 'ANOTHER_SECRET') {  // Warning! assigning a value variable in an if condition
    console.log (x)
}

साथ में:

// Will output 'ANOTHER_SECRET'

var y = 'SECRET'
if (y = 'ANOTHER_SECRET') { 
    console.log (y)
}

या

// Will throw TypeError: const 'x' has already been declared

const x = "SECRET"

/*  complex code */

var x = 0

साथ में

// Will reassign y and cause trouble

var y = "SECRET"

/*  complex code */

var y = 0

आपको कहना चाहिए कि यह "अपरिवर्तनीय" व्यवहार केवल स्ट्रिंग्स, मूल प्रकारों पर लागू होता है। ऑब्जेक्ट्स, एरेज़ आदि का उपयोग करके मूल्यों को बदलना संभव है, लेकिन एक नए "ऑब्जेक्ट" को फिर से असाइन करना संभव नहीं है, उदाहरण के लिए a = ["a", "b"]; a = []; एक त्रुटि फेंक देंगे अन्यथा यह संभव है
फेर

आपके पास एक उदाहरण होना चाहिए जहां आप कोशिश करते हैं और एक स्थिर मूल्य को भी बदलते हैं।
जोशुआ पिंटर

कास्ट का उपयोग एक्सेस मॉडिफायर की तरह है, लक्ष्य के लिए सही अपरिवर्तनीयता नहीं है।
स्टिंगजैक

32

const है अपरिवर्तनीय।

वहाँ से MDN :

कॉन्स्ट डिक्लेरेशन एक वैल्यू का रीड-ओनली रेफरेंस बनाता है। इसका मतलब यह नहीं है कि यह मूल्य अपरिवर्तनीय है, बस यह है कि चर पहचानकर्ता को आश्वस्त नहीं किया जा सकता है।


24
हालांकि यह थोड़ा भ्रामक है। संख्याओं के लिए, तार, बूलियन, आदि (आदिम) constअपरिवर्तनीय है। ऑब्जेक्ट और सरणियों के लिए इसे पुन: असाइन नहीं किया जा सकता है, लेकिन सामग्री को बदला जा सकता है (उदाहरण के लिए array.push)।
फ्लोरियन वेंडेलबोर्न

2
हालांकि जेएस प्राइमिटिव हमेशा अपरिवर्तनीय हैं। चाहे आप उपयोग करें constया न करें, यह प्रभावित नहीं करता है।
12M2121

1
@Dodekeract इसलिए यह परिभाषा से अपरिवर्तनीय नहीं है। यदि मान बदल सकते हैं, तो यह अपरिवर्तनीय नहीं है, हालांकि यह आपके द्वारा सूचीबद्ध प्राइमिटिव के लिए अपरिवर्तनीय के रूप में कार्य करता है
एंथनी

13

var : किसी वैरिएबल को डिक्लेयर करें, वैल्यू इनिशियलाइज़ेशन ऑप्शनल।

आज्ञा देना : ब्लॉक स्कोप के साथ एक स्थानीय चर घोषित करें।

const : केवल पढ़ने के लिए नामित नाम घोषित करें।

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

var a;
a = 1;
a = 2;//re-initialize possible
var a = 3;//re-declare
console.log(a);//3

let b;
b = 5;
b = 6;//re-initiliaze possible
// let b = 7; //re-declare not possible
console.log(b);

// const c;
// c = 9;   //initialization and declaration at same place
const c = 9;
// const c = 9;// re-declare and initialization is not possible
console.log(c);//9
// NOTE: Constants can be declared with uppercase or lowercase, but a common
// convention is to use all-uppercase letters.

10

आपके पास महान जवाब हैं, लेकिन हम इसे सरल रखें।

const जब आप एक परिभाषित स्थिरांक का उपयोग किया जाना चाहिए (के रूप में पढ़ें: यह आपके कार्यक्रम के निष्पादन के दौरान नहीं बदलेगा)।

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

const pi = 3.1415926535

अगर आपको लगता है कि यह एक ऐसी चीज है जिसे बाद में अमल में लाया जा सकता है तो ए का उपयोग करें var

उदाहरण के आधार पर व्यावहारिक अंतर यह है कि constआप हमेशा मानेंगे कि पीआई 3.14 [...] होगा, यह एक तथ्य है।

यदि आप इसे एक के रूप में परिभाषित करते हैं var, तो यह 3.14 हो सकता है [...] या नहीं।

अधिक तकनीकी उत्तर के लिए @ टिबोस अकादमिक रूप से सही है।


7

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

आपके परीक्षण में त्रुटि एक और बात है, हालांकि, आप x नामक एक अन्य चर बनाने की कोशिश कर रहे हैं, यह एक अधिक सटीक परीक्षण होगा।

const x = 'const';
x = 'not-const';

9
मुझे वह मिलता है जो आप का मतलब है, लेकिन - यह मज़ेदार है कि आपके लिए "निरंतर" का अर्थ है "वह चीज जिसे मैं बदलना चाहता हूं"। : पी
वेनरिक्स

4

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


17
यह एक बहुत लंबी चलने वाली स्क्रिप्ट होगी!
nullability 15

3
@nullability निर्भर करता है कि आप कितने लोगों की उम्र ट्रैक कर रहे हैं। कुछ दर्जन से अधिक और स्क्रिप्ट को लंबे समय तक नहीं चलना होगा :)।
मिल्ली स्मिथ

4

सारांश:

const एक अपरिवर्तनीय बाइंडिंग अर्थ बनाता है const वैरिएबल आइडेंटिफ़ायर पुन: असाइन करने योग्य नहीं है।

const a = "value1";

आप इसे फिर से असाइन नहीं कर सकते

a = "value2";

हालाँकि, यदि कास्ट आइडेंटिफ़ायर एक ऑब्जेक्ट या एक सरणी रखता है, तो इसका मूल्य तब तक बदला जा सकता है, जब तक हम इसे पुनः असाइन नहीं कर रहे हैं।

const x = { a: 1 }

x.a = 2; //is possible and allowed

const numbers = [1, 2];
numbers.push(3); //is possible and allowed

कृपया ध्यान दें कि स्थिरांक है एक ब्लॉक-दायरे वाले की तरह ही देना जो के समान नहीं है वर (जो समारोह-दायरे वाले है)

संक्षेप में, जब कुछ होने की संभावना नहीं है फिर से काम के माध्यम से परिवर्तन उपयोग const किसी और उपयोग करते हैं या वर गुंजाइश आप करना चाहते हैं पर निर्भर करता है।

कोड के बारे में तर्क करना बहुत आसान है जब यह स्पष्ट है कि पुन: असाइनमेंट के माध्यम से क्या बदला जा सकता है और क्या नहीं हो सकता है। एक कास्ट करने के लिए एक कास्ट बदल सरल मर चुका है। और डिफॉल्ट रूप से कांस्टेबल ऐसा करने से पहले दो बार सोचता है। और यह कई मामलों में एक अच्छी बात है।


2

यह प्रदान करता है: 1) एक स्थिर संदर्भ, उदाहरण के लिए const x = [] - सरणी को संशोधित किया जा सकता है, लेकिन x किसी अन्य सरणी को इंगित नहीं कर सकता है; और 2) ब्लॉक स्कूपिंग। const और let एक साथ varma6 / 2015 में var की जगह लेंगे। https://strongloop.com/strongblog/es6-variable-declarations/ पर चर्चा देखें


2
Main point is that how to decide which one identifier should be used during development.
In java-script here are three identifiers.

1. var (Can re-declared & re-initialize)
2. const (Can't re-declared & re-initialize, can update array values by using push)
3. let (Can re-initialize but can't re-declare)

'var': कोडिंग के समय जब हम कोड-मानक के बारे में बात करते हैं तो हम आमतौर पर पहचानकर्ता के नाम का उपयोग करते हैं, जो कि अन्य उपयोगकर्ता / डेवलपर द्वारा समझने में आसान होता है। उदाहरण के लिए यदि हम कई कार्यों पर विचार कर रहे हैं जहां हम कुछ इनपुट का उपयोग करते हैं और इसे संसाधित करते हैं और कुछ परिणाम लौटाते हैं, जैसे:

**Example of variable use**

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2;
 return result;
}

ऊपर दिए गए उदाहरणों में दोनों अलग-अलग परिणामों का उत्पादन करते हैं, लेकिन चर के एक ही नाम का उपयोग करते हैं। यहां हम 'प्रक्रिया' और 'परिणाम' देख सकते हैं, दोनों का उपयोग चर के रूप में किया जाता है और उन्हें होना चाहिए।

 **Example of constant with variable**

 const tax = 10; 
 const pi = 3.1415926535; 

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

जावा-स्क्रिप्ट में to लेट ’का उपयोग करने से पहले हमें js फाइल के शीर्ष पर 'यूज़ सख्त’ जोड़ना होगा

 **Example of let with constant & variable**

 const tax = 10; 
 const pi = 3.1415926535; 
 let trackExecution = '';

function firstFunction(input1,input2)
{
 trackExecution += 'On firstFunction'; 
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 trackExecution += 'On otherFunction'; # can add current time 
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

 firstFunction();
 otherFunction();
 console.log(trackExecution);

ऊपर दिए गए उदाहरण में आप ट्रैक कर सकते हैं कि किसी एक फ़ंक्शन को कब और किस एक फ़ंक्शन को विशिष्ट क्रिया के दौरान उपयोग नहीं किया गया है।


1

सबसे पहले, तीन उपयोगी चीजों के बारे में const(इसके अलावा इसके दायरे में आने वाले सुधारों के अलावा let):

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

आपके सवाल:

जब इसका इस्तेमाल के लिए उपयुक्त है constके स्थान पर var?

आप इसे किसी भी समय कर सकते हैं जब आप एक चर घोषित कर रहे हैं जिसका मूल्य कभी नहीं बदलता है। क्या आप मानते हैं कि उपयुक्त आपकी प्राथमिकता / आपकी टीम की प्राथमिकता के लिए पूरी तरह से नीचे है।

क्या इसे हर बार इस्तेमाल किया जाना चाहिए जो एक चर नहीं है जिसे फिर से सौंपा जाना है?

यह आपकी / आपकी टीम के ऊपर है।

क्या वास्तव में इससे कोई फर्क पड़ता है अगर var is used in place ofconst` या इसके विपरीत?

हाँ:

  • varऔर constअलग-अलग गुंजाइश नियम हैं। (आप letइसके बजाय तुलना करना चाहते थे var।) विशेष रूप से: constऔर letब्लॉक-स्कोप्ड हैं और जब वैश्विक दायरे में उपयोग किया जाता है, तो वैश्विक ऑब्जेक्ट पर गुण न बनाएं (भले ही वे ग्लोबल्स बनाते हों)। varया तो वैश्विक स्कोप है (जब वैश्विक स्कोप में उपयोग किया जाता है) या फंक्शन स्कोप (भले ही किसी ब्लॉक में उपयोग किया जाता है), और जब वैश्विक स्कोप में उपयोग किया जाता है, तो वैश्विक ऑब्जेक्ट पर एक संपत्ति बनाता है।
  • ऊपर मेरी "तीन उपयोगी चीजें" देखें, वे सभी इस प्रश्न पर लागू होते हैं।

1

का अर्थ विज्ञान varऔरlet

varऔर letमशीन और अन्य प्रोग्रामर के लिए एक बयान है:

मैं चाहता हूं कि निष्पादन के दौरान इस असाइनमेंट का मूल्य बदल जाए। इस असाइनमेंट के अंतिम मूल्य पर भरोसा न करें।

उपयोग करने के निहितार्थ varऔरlet

varऔर letअन्य प्रोग्रामर को कार्यक्रम के निष्पादन में उस बिंदु पर असाइनमेंट के मूल्य, और असाइनमेंट के मूल्य के बारे में कारण से सभी हस्तक्षेप कोड को पढ़ने के लिए मजबूर करते हैं।

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

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

कब इस्तेमाल करें const

यदि संदर्भ का मूल्य निष्पादन के पाठ्यक्रम में नहीं बदलता है, तो प्रोग्रामर के इरादे को व्यक्त करने के लिए सही वाक्यविन्यास है const। वस्तुओं के लिए, संदर्भ के मूल्य को बदलने का अर्थ है कि किसी अन्य वस्तु की ओर इशारा करना, क्योंकि संदर्भ अपरिवर्तनीय है, लेकिन वस्तु नहीं है।

" const" वस्तुओं

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

अपरिवर्तनीय वस्तुओं को प्राप्त करने के लिए (जो फिर से, आपके कोड को मनुष्यों और मशीनों के बारे में तर्क करना आसान बनाते हैं), आप Object.freezeइस तरह से घोषणा / असाइनमेंट / निर्माण में वस्तु कर सकते हैं :

const Options = Object.freeze(['YES', 'NO'])

Object.freeze का प्रदर्शन पर प्रभाव पड़ता है, लेकिन आपका कोड संभवतः अन्य कारणों से धीमा है। आप इसे प्रोफाइल करना चाहते हैं।

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

कब varऔर letकैसे एक अच्छा मैच है

letऔर varपरस्पर अवस्था का प्रतिनिधित्व करते हैं। उन्हें, मेरी राय में, केवल वास्तविक परिवर्तनशील स्थिति को मॉडल करने के लिए उपयोग किया जाना चाहिए । " कनेक्शन जिंदा है? " जैसी चीजें ।

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

साइड-इफेक्ट्स की रचना और डेटा को बदलने के साथ प्रोग्रामिंग पहले से ही काफी कठिन है। प्रत्येक फ़ंक्शन को एक अस्थिर राज्य मशीन में बदलकर परिवर्तनशील राज्य को केवल जटिलता पर ढेर के साथ उत्परिवर्तित राज्य बनाकर।

अधिक बारीक व्याख्या के लिए, शॉन द म्यूटेंट - के लिए मामला देखेंconst



0

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

आम तौर पर चर का एक गुच्छा घोषित करने और बदलने के बाद, स्मृति खंडित हो जाती है, और v8 निष्पादित करने के लिए रोक रहा है, कुछ सेकंड के कुछ समय के लिए, जीसी या कचरा संग्रह करने के लिए ठहराव देता है।

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


0

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

यह बात आती है वर , के बाद से ES6 बाहर है, मैं इसे उत्पादन कोड में इस्तेमाल कभी नहीं किया और इसके लिए एक उपयोग के मामले के बारे में सोच नहीं कर सकते। फिर भी, सावधान रहें कि var के साथ घोषित चर में ब्लॉक स्कोप नहीं है।

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