javascript - जावास्क्रिप्ट में कॉन्स? इसका उपयोग कब करें और यह आवश्यक है




node.js const (9)

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

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

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

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

प्रश्न ?

Var के स्थान पर कॉन्स का उपयोग करना उचित कब है?

क्या इसे हर बार एक वेरिएबल का उपयोग किया जाना चाहिए जिसे फिर से असाइन नहीं किया जा रहा है?

यदि वास्तव में कॉन्स या इसके विपरीत के रूप में var का उपयोग किया जाता है तो क्या यह वास्तव में कोई फर्क पड़ता है?



आपके पास बहुत अच्छे जवाब हैं, लेकिन चलिए इसे सरल रखें।

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

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

const pi = 3.1415926535

यदि आपको लगता है कि यह ऐसा कुछ है जिसे बाद में निष्पादन पर बदला जा सकता है तो एक var उपयोग करें।

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

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

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


कॉन्स का उपयोग क्यों करें, @ तिब्स के जवाब का महान।

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

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

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

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 आपको परिवर्तनीय परिवर्तनों से नहीं रोकता है, यह आपको उन्हें फिर से असाइन करने से रोकता है।


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

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

// 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

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

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

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


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


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

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

आपके सवाल:

var स्थान पर const का उपयोग करना उचित कब है?

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

क्या इसे हर बार एक वेरिएबल का उपयोग किया जाना चाहिए जिसे फिर से असाइन नहीं किया जा रहा है?

यह आप / आपकी टीम पर निर्भर है।

यदि वास्तव var is used in place of कॉन्स 'या इसके विपरीत के var is used in place of तो क्या यह वास्तव में कोई फर्क पड़ता है?

हाँ:

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

सारांश:

कॉन्स एक अपरिवर्तनीय बाध्यकारी अर्थ बनाता है कॉन्स वैरिएबल पहचानकर्ता फिर से असाइन करने योग्य नहीं है।

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

कृपया ध्यान दें कि कॉन्स एक ब्लॉक-स्कॉप्ड है जैसे कि var के समान नहीं है (जो फ़ंक्शन-स्कोप्ड है)

संक्षेप में, जब पुनः-असाइनमेंट उपयोग के माध्यम से कुछ बदलने की संभावना नहीं है, तो उस स्थान के आधार पर चलो या var का उपयोग करें जो आप चाहते हैं।

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


2017 अद्यतन

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

2014 से मूल उत्तर

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

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

यह तब कहता है:

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

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






immutability