मुझे ES6 में 'लेट' बनाम 'कॉन्स्ट' का कितना उपयोग करना चाहिए?


214

मैं हाल ही में io.js के लिए बहुत सारे ES6 कोड लिख रहा हूं। वहाँ से सीखने के लिए जंगली में बहुत कोड नहीं है, इसलिए मुझे लगता है कि मैं अपने स्वयं के सम्मेलनों को परिभाषित कर रहा हूं क्योंकि मैं जाता हूं।

मेरा सवाल है कि कब constबनाम का उपयोग करना है let

मैं इस नियम को लागू कर रहा हूं: यदि संभव हो तो उपयोग करें const। केवल तभी उपयोग करें letजब आप जानते हैं कि इसके मूल्य को बदलना आवश्यक है। (आप हमेशा वापस जा सकते हैं और एक को बदल सकते हैं constएक करने के लिए letअगर यह बाद में पता चला है कि आप अपने मूल्य को बदलने की जरूरत है।)

इस नियम का मुख्य कारण लगातार लागू करना आसान है। ग्रे क्षेत्र नहीं हैं।

बात यह है, जब मैं इस नियम को लागू करता हूं, तो व्यवहार में मेरी घोषणाओं में से 95% हैं const। और यह मुझे अजीब लगता है। मैं केवल एक लूप letजैसी चीजों के लिए उपयोग कर रहा हूं , या कभी-कभी संचित फाइबोनैचि योग जैसे चीजों के लिए (जो वास्तविक जीवन में बहुत ऊपर नहीं आता है)। मैं इससे हैरान था - यह पता चलता है कि मेरे ES5 कोड में 95% 'वैरिएबल्स' उन मूल्यों के लिए थे जो भिन्न नहीं होते हैं। लेकिन मेरे कोड को देखकर किसी भी तरह गलत लगता है।iforconst

तो मेरा सवाल है: क्या यह constइतना उपयोग करना ठीक है ? क्या मुझे वास्तव में चीजों को पसंद करना चाहिए const foo = function () {...};?

या मुझे constउन प्रकार की स्थितियों के लिए आरक्षित करना चाहिए जहां आप मॉड्यूल के शीर्ष पर एक शाब्दिक-कोडिंग कर रहे हैं - जिस तरह से आप पूर्ण कैप्स में करते हैं, जैसे const MARGIN_WIDTH = 410;?


7
मुझे संदेह है कि यह प्रश्न मुख्य रूप से राय-आधारित है और इस तरह से बंद होने की संभावना है, लेकिन मेरे 2 सेंट: यह constइस का उपयोग करने के लिए ठीक है ।
झूमिनल

15
function foo() {...}से बेहतर है<anything> foo = function() {...}
ऑरेंजडॉग

12
@OrangeDog मैं इसके लिए आपका स्पष्टीकरण देखना चाहूंगा, क्योंकि मैंने इसके ठीक विपरीत निष्कर्ष निकाला है। एक कैवेट है जो function foo() {...}डीबगिंग के समय मामूली भ्रम पैदा कर सकता है, उत्थापन के कारण। इसके अलावा, इसके अस्तित्व का मतलब है कि हमारे पास दो निर्माण हैं जो एक ही काम करते हैं लेकिन उनमें से एक केवल एक बहुत ही विशिष्ट संदर्भ में काम करता है। (आप एक अभिव्यक्ति अभिव्यक्ति का उपयोग कर सकते हैं कहीं भी एक अभिव्यक्ति मौजूद हो सकती है, लेकिन आप केवल बयान स्तर पर एक फ़ंक्शन घोषणा का उपयोग कर सकते हैं।) यदि आप संक्षिप्तता का पक्ष लेते हैं, तो समस्या बस यह हो सकती है कि फ़ंक्शन अभिव्यक्ति वाक्यविन्यास पूरे शब्द का उपयोग करता है function
कीन

11
स्टैक के निशान में एनॉन के बजाय फ़ंक्शन का नाम है। उत्थापन अच्छा है और मान लें कि आप किसी प्राकृतिक क्रम में कार्यों को परिभाषित करते हैं, बिना किसी चिंता के चिंतित होने के कारण।
ऑरेंजडॉग

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

जवाबों:


183

यहाँ मेरा उत्तर जावास्क्रिप्ट-विशिष्ट नहीं है।

किसी भी भाषा में अंगूठे के एक नियम के रूप में जो मुझे अर्ध-आसान तरीके से ऐसा करने देता है, मैं कहता हूं कि जब भी संभव हो, हमेशा कॉन्स्ट / फ़ाइनल / रीडऑनली / जो भी इसे आपकी भाषा में कहा जाता है, का उपयोग करें। कारण सरल है, कोड के बारे में तर्क करना बहुत आसान है जब यह स्पष्ट है कि क्या बदल सकता है और क्या नहीं बदल सकता है। और इसके अलावा, कई भाषाओं में आपको टूल सपोर्ट मिल सकता है जो आपको बताता है कि आप कुछ गलत कर रहे हैं जब आप एक वैरिएबल को असाइन करते हैं जिसे आपने कास्ट घोषित किया है।

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

आपने कितने बग देखे हैं जिनमें शामिल चर अनपेक्षित रूप से बदल रहे हैं? मुझे बहुत कुछ लगता है। मुझे पता है कि मैं जिन बहुसंख्यक बगों को देखता हूं उनमें अप्रत्याशित राज्य परिवर्तन शामिल हैं। आप इन सभी बगों से मुक्त होकर कांस्टेबल का उपयोग नहीं करेंगे, लेकिन आप उनमें से बहुत से छुटकारा पा लेंगे!

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

और यह सब कास्ट के साथ बेहद उदार होने के साथ शुरू होता है! ;) यह लिखने की तुलना में लिखने के लिए सिर्फ दो और चरित्र हैं, इसलिए आगे बढ़ें और constसभी चीजें!


45
constकी तुलना में दो अधिक वर्ण हैं let...
ऑरेंजडॉग

72
लेकिन अपरिवर्तनीय से 5 वर्ण कम।
18

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

7
मैं इस जवाब से सहमत हूं, लेकिन ध्यान रखिए कि चीजें इतनी स्पष्ट नहीं होती हैं जब सादे वस्तुओं या सरणियों जैसी चीजों के साथ काम कर रहे हों, क्योंकि उनके गुणों को बदल सकते हैं भले ही वे 'कॉन्स्ट' के साथ परिभाषित किए गए हों। मैंने 'कॉन्स्ट' को ऑब्जेक्ट की तरह काम करने के बारे में सोचा था। फाइजर लेकिन ऐसा नहीं है।
बैकडेस्क

2
@Cerad क्या आपका मतलब था "4 वर्ण कम" या क्या मुझे यहाँ कुछ मजाक याद आ रहा है?
मथियास बिएनेंस

57

सावधान रहें, क्योंकि constऑब्जेक्ट कुंजियाँ परस्पर हैं।

यहाँ से: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

ऑब्जेक्ट कुंजियाँ सुरक्षित नहीं हैं

इस उदाहरण पर विचार करें:

const colors = {red: "#f00"}; 
console.log(colors); // { "red": "#f00" }

colors.red = "#00f";
colors.green = "#0f0";
console.log(colors); // { "red": "#00f", "green": "#0f0" }

सरणियों के लिए एक ही बात:

const numbers = [1, 2, 3];
console.log(numbers); // [ 1, 2, 3 ]

numbers.push(4);
console.log(numbers); // [ 1, 2, 3, 4 ]

मैंने पूरी तरह से खुद तय नहीं किया है, लेकिन मैं constसभी गैर-सरणी / गैर-ऑब्जेक्ट्स और letऑब्जेक्ट / एरेज़ के लिए उपयोग करने पर विचार कर रहा हूं ।


34
सही, लेकिन अपेक्षित IMO - जो स्थिर है वह आपके लिए निर्दिष्ट ऑब्जेक्ट संदर्भ है constcolors = numbersउम्मीद के मुताबिक काम नहीं होगा। यदि आप अपने ऑब्जेक्ट प्रॉपर्टीज की सुरक्षा करना चाहते हैं, तो आप Object.freeze() डेवलपर.
mozilla.org/en-US/docs/Web/JavaScript/Reference/…

16
गुमराह करने वाले। यह असाध्य है। लेकिन वास्तविक वस्तु गुण नहीं हैं।
गैस्टन सांचेज

1
+1 हाँ, संदर्भ सुरक्षित है, लेकिन प्रश्न के संदर्भ मेंconst moment = require('moment') , जब तक कि आप उस व्यक्ति के प्रकार का उपयोग नहीं करते हैं, जब तक कि आप उस प्रकार के व्यक्ति नहीं हैं जो चिंतित है कि कोई moment = dead.fish(() => pizza)बाद में करने की कोशिश करेगा ।
मैक्सवेल

5
शायद अधिक यथार्थवादी के बारे में चिंता करने की moment = Date.now()। लेकिन किसी भी मामले में, यदि कोड एक अपरिवर्तनीय मानता है, तो मुझे यह संभव होने पर इसे लागू करने में कुछ भी गलत नहीं दिखता है।
जेम्स एम।

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

25

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

जब यह वस्तुओं की बात आती है, constतो आपके चर को पुनर्मूल्यांकन से बचाएगा, लेकिन अगर आपको अपरिवर्तनीय वस्तुओं की आवश्यकता है, तो आपको Object.freezeविधि की आवश्यकता होगी , नीचे देखें।

const immutableOject = Object.freeze({immutableProperty: 'foo'});

constकेवल पुनर्मूल्यांकन से रक्षा करेगा, और freezeविधि सभी तत्काल गुणों की रक्षा करेगी। यदि आपको सभी नेस्टेड गुणों को भी अपरिवर्तनीय बनाने की आवश्यकता है, तो आपको freezeउन्हें पुनरावृत्ति करने की आवश्यकता होगी ।


14
ध्यान दें कि Object.freezeउथला है।
मथियास बिएनेंस

@MathiasBynens मैं इस टिप्पणी पर आया हूं और मैं उत्सुक हूं कि आप वास्तव में इसके द्वारा क्या मतलब है। क्या आप कृपया विस्तार से बता सकते हैं?
कोल रॉबर्ट्स

@ColeRoberts उथले अपरिवर्तनीयता की अवधारणा है, जब ऑब्जेक्ट संदर्भ स्वयं अपरिवर्तनीय है, लेकिन गुण अभी भी बदले जा सकते हैं। कॉन्स्ट कीवर्ड केवल उथले अपरिवर्तनीयता के लिए बनाता है, इसलिए आपको ऑब्जेक्ट का उपयोग करने की आवश्यकता है। यदि सभी गुण भी अपरिवर्तनीय होने चाहिए।
clean_coding

3
@ColeRoberts इसका मतलब है कि एक जमे हुए ऑब्जेक्ट (यानी नेस्टेड ऑब्जेक्ट) के भीतर ऑब्जेक्ट वैल्यू अभी भी म्यूट की जा सकती है। अधिक जानकारी के लिए mathiasbynens.be/notes/es6-const#immutable-values देखें ।
मथियास ब्यनेंस 20

19

मेरे ES6 constमें अपरिवर्तनीयता के बारे में नहीं है , मैं समझाता हूं constकि कल्पना के अनुसार वास्तव में क्या मतलब है।

उन वस्तुनिष्ठ तथ्यों के आधार पर, यहाँ मेरी व्यक्तिगत प्राथमिकता है:

[...] इसका उपयोग करने के लिए समझ में आता है letऔर constआपके ES6 कोड में निम्नानुसार है:

  • constडिफ़ॉल्ट रूप से उपयोग करें
  • केवल तभी उपयोग करें letजब रिबाइंडिंग (यानी पुन: असाइनमेंट के किसी भी रूप) की आवश्यकता हो
  • ( varईएस 6 में इस्तेमाल नहीं किया जाना चाहिए)

विषय के रूप में यह हो सकता है, यह एक तथ्य है कि यह सबसे अधिक बारीकी से कल्पना के इरादे से मेल खाता है।

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

का उपयोग करना constस्थिरांक के लिए केवल उपयोग करने जैसा है HTML <aside>तत्व केवल साइड बार सामग्री के लिए।


2
constअगर आप स्थिर नहीं हैं तो आप कुछ नाम क्यों देंगे ?
nu सदाबहार

3
@nueverest क्योंकि यही नहीं constहै। क्या आपने ऊपर पढ़ा?
मथियास ब्यनेंस

2
@MathiasBynens मुझे लगता है (केवल?) समस्या constयह है कि इसे कहा जाता है const। यह एक गूंगा नाम (जावास्क्रिप्ट में) है जो पहले कई (सभी?) डेवलपर्स को भ्रमित करता है। IMO बेहतर होता अगर constकॉल किया गया होता let(विशेषकर क्योंकि letकम है, लेकिन constबहुत अधिक सामान्य है) और letकुछ और कहा जाता है।
MrN00b

@MathiasBynens मैं इसे प्राप्त करता हूं लेकिन इसे क्यों कहते हैं? जैसे ही यह पृष्ठ प्रदर्शित होता है यह भारी मात्रा में भ्रम पैदा कर रहा है।
jtr13

4

मेरा व्यक्तिगत दृष्टिकोण, कोड पठनीयता और समझ में मदद करने के लिए सोचा:


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

for (let key in something) {
  /* we could use `something[key]` for this entire block,
     but it would be too much letters and not good for the
     fingers or the eyes, so we use a radically temporary variable
  */
  let value = something[key]
  ...
}

constपूरे मॉड्यूल में सभी नामों को स्थिर रखने के लिए जाना जाता है। स्थानीय रूप से स्थिर मूल्यों सहित नहीं। valueऊपर के उदाहरण में, उदाहरण के लिए, अपने दायरे में स्थिर है और साथ घोषित किया जा सकता constहै, लेकिन बाद से वहाँ कई पुनरावृत्तियों हैं और हर एक के लिए एक ही साथ एक मूल्य नहीं है नाम , "मूल्य", कि पाठक धोखा हो सकता है सोच में valueहमेशा होता है वही। मॉड्यूल और फ़ंक्शन constचर का सबसे अच्छा उदाहरण हैं :

const PouchDB = require('pouchdb')
const instantiateDB = function () {}
const codes = {
  23: 'atc',
  43: 'qwx',
  77: 'oxi'
}

varहर चीज के लिए जो परिवर्तनशील हो या न हो। नाम जो लोगों को कोड पढ़ने में भ्रमित कर सकते हैं, भले ही वे स्थानीय रूप से स्थिर हों, और let(यानी वे एक साधारण प्रत्यक्ष घोषणा में पूरा नहीं होते हैं) के साथ उपयुक्त होने के लिए लागू होते हैं var। उदाहरण के लिए:

var output = '\n'
lines.forEach(line => {
  output += '  '
  output += line.trim()
  output += '\n'
})
output += '\n---'

for (let parent in parents) {
  var definitions = {}
  definitions.name = getName(parent)
  definitions.config = {}
  definitions.parent = parent
}

आगे की टिप्पणी और भविष्य के संभावित अद्यतन यहाँ


10
दूसरा कोड स्निपेट बंदूक की तरह दिखता है।
जूलियन

1

जावास्क्रिप्ट कुछ खास है जिसमें चर कार्य और ऐसे हो सकते हैं, लेकिन सी #, जावा या इसी तरह की अन्य सी शैली की भाषा पर विचार करें:

const public void DoSomething()

यह constअजीब है, और ऐसा इसलिए है क्योंकि इन भाषाओं में विधि घोषणाएं बदल नहीं सकती हैं, एक बार जब वे किसी और चीज़ में संकलित हो जाते हैं, तो वे यही करते हैं, कोई फर्क नहीं पड़ता कि क्या (कुछ भयानक हैक की मौजूदगी को अनदेखा कर सकते हैं)।

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

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