क्या जावास्क्रिप्ट में स्थिरांक हैं?


1132

क्या जावास्क्रिप्ट में स्थिरांक का उपयोग करने का एक तरीका है ?

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


35
Chromeआपको कॉन्स्टैंट constका उपयोग करने के लिए कीवर्ड का उपयोग करने की अनुमति देता है। उदा const ASDF = "asdf"। हालाँकि, चूंकि constबहु ब्राउज़र संगत नहीं है, मैं आमतौर पर एक varघोषणा के साथ रहता हूं ।
जैक्सनक्राक

20
try{const thing=1091;}catch(e){var thing=1091;}काम करता है।
डेरेक 會 功夫

13
डेरेक: आपकी कोशिश / कैच उस चीज़ के दायरे को सीमित नहीं करेगा जिसे आप ट्राइ / कैच ब्लॉक में घोषित कर रहे हैं? यदि आप ठीक से नहीं कर रहे हैं तो निर्दिष्ट करने का क्या मतलब है constया varबिल्कुल भी?
कोडर

8
@ वर्तमान कार्यान्वयन में कोडर, यह काम करेगा, जैसा कि constइसमें एक ही गुंजाइश है var, और यह फ़ंक्शन-स्तर है, न कि ब्लॉक-स्तर। यदि आप इसके बजाय आगामी ECMAScript मानक का पालन करते हैं, तो इसके constसमान गुंजाइश है let, जिसका अर्थ है कि यह काम नहीं करेगा।
जैस्पर

3
@ कोडर गलत भाषा। जावास्क्रिप्ट में चर समारोह गुंजाइश है। यह सी नहीं है
doug65536

जवाबों:


1018

ES2015 के बाद से , जावास्क्रिप्ट की एक धारणा है const:

const MY_CONSTANT = "some-value";

यह IE 8, 9 और 10 को छोड़कर सभी बहुत ब्राउज़रों में काम करेगा । कुछ को सख्त मोड सक्षम करने की भी आवश्यकता हो सकती है ।

आप यह varदिखाने के लिए ALL_CAPS जैसे सम्मेलनों का उपयोग कर सकते हैं कि यदि आपको पुराने ब्राउज़र का समर्थन करने की आवश्यकता है या विरासत कोड के साथ काम कर रहे हैं तो कुछ मूल्यों को संशोधित नहीं किया जाना चाहिए:

var MY_CONSTANT = "some-value";

60
Const x = 24 के बारे में कैसे;
स्कॉट

93
ध्यान दें कि यदि आपको क्रॉस-ब्राउज़र संगतता (या राइनो या Node.js में सर्वर-साइड प्रोग्रामिंग की आवश्यकता नहीं है) तो आप constकीवर्ड का उपयोग कर सकते हैं । यह वर्तमान में IE को छोड़कर सभी आधुनिक ब्राउज़रों द्वारा समर्थित है।
कर्क

17
इन दिनों (3.5 वर्ष बाद) आप Object.definePropertyकेवल पढ़ने योग्य गुण बनाने के लिए उपयोग कर सकते हैं जिन्हें हटाया भी नहीं जा सकता। यह सभी प्रमुख ब्राउज़रों के वर्तमान संस्करण में काम करता है (लेकिन IE8 में गलत तरीके से )। उत्तर देखें @Notaname
Phrogz

12
@ ऐमिथ यह वास्तव में मददगार नहीं है। यह एक एकमात्र विक्रेता द्वारा प्रस्तावित शैली गाइड है । ऊपर हस्की बिंदु के अनुसार, सर्वर-साइड JS लिखते समय IE संगतता पूरी तरह से अप्रासंगिक है।
aendrew

32
चूंकि यह उत्तर अभी भी Google द्वारा 2015 में अत्यधिक रैंक पर है, इसलिए कहा जाना चाहिए कि यह अब अप्रचलित है। constकीवर्ड अब आधिकारिक तौर पर भाषा का हिस्सा है और हर ब्राउज़र द्वारा समर्थित है। Statcounter.com के अनुसार केवल कुछ प्रतिशत इंटरनेट उपयोगकर्ता अभी भी पुराने ब्राउज़र संस्करणों का उपयोग करते हैं जो समर्थन नहीं करते थे const
ट्रिस्टन

310

क्या आप संशोधन के खिलाफ चर की रक्षा करने की कोशिश कर रहे हैं? यदि ऐसा है, तो आप एक मॉड्यूल पैटर्न का उपयोग कर सकते हैं:

var CONFIG = (function() {
     var private = {
         'MY_CONST': '1',
         'ANOTHER_CONST': '2'
     };

     return {
        get: function(name) { return private[name]; }
    };
})();

alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.MY_CONST = '2';
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.private.MY_CONST = '2';                 // error
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

इस दृष्टिकोण का उपयोग करके, मूल्यों को संशोधित नहीं किया जा सकता है। लेकिन, आपको CONFIG :( पर विधि प्राप्त करें) का उपयोग करना होगा।

यदि आपको चर मानों को कड़ाई से संरक्षित करने की आवश्यकता नहीं है, तो बस सुझाव के रूप में करें और सभी CAPS के सम्मेलन का उपयोग करें।


13
ध्यान दें कि आप CONFIG के मान के लिए एक फ़ंक्शन वापस कर सकते हैं। यह आपको हर समय CONFIG.get () कॉल करने से बचाएगा।
मैथ्यू बर्न

4
सुंदर समाधान। लेकिन ऐसी चीजों को किसी भी नए प्रोजेक्ट में नया रूप देने के लिए लाइब्रेरी के रूप में लपेटा जाना चाहिए।
andrii

82
CONFIG.get = someNewFunctionThatBreaksTheCode... सभी में, आप बिल्कुल JS (w / o const कीवर्ड) में स्थिरांक लागू नहीं कर सकते। केवल एक चीज जो आप कर सकते हैं, वह है दृश्यता को सीमित करना।
थॉमस ईडिंग

28
मुझे विश्वास है कि privateयह जावास्क्रिप्ट में भविष्य का आरक्षित शब्द है, मैं इसका उपयोग नहीं करूंगा यदि मैं आप थे।
ज़क

यह भी रजिस्ट्री पैटर्न है।

122

यह constकीवर्ड ECMAScript 6 के मसौदे में है, लेकिन इस प्रकार अब तक केवल ब्राउज़र समर्थन का एक ही आनंद मिलता है: http://kangax.github.io/compat-table/es6/ । वाक्य रचना है:

const CONSTANT_NAME = 0;

13
यदि आप किसी मान को असाइन करने का प्रयास करते हैं const, तो यह कोई त्रुटि नहीं है। असाइनमेंट बस विफल हो जाता है और स्थिर का अभी भी मूल मूल्य है। यह एक प्रमुख डिज़ाइन दोष है IMHO लेकिन जब तक एक स्पष्ट, सुसंगत नामकरण सम्मेलन (जैसे कि लोकप्रिय ALL_CAPS) है, मुझे नहीं लगता कि यह बहुत दुख का कारण होगा।
मेट्रिक्सफ्रॉग

6
ब्राउज़र समर्थन पर यहाँ नज़र रखें: kangax.github.io/es5-compat-table/es6/#const
मार्क मैकडॉनल्ड

6
@MatrixFrog असाइनमेंट में त्रुटि आएगी 'use strict'
सैम

क्या मुझे स्थिरांक को परिभाषित करना चाहिए ALL CAPS?
लुईस

1
@Tresdin सभी कैप्स में स्थिरांक को परिभाषित करना एक सामान्य नामकरण सम्मेलन है। भाषा में कुछ भी कल्पना नहीं करता है, लेकिन यह एक बुरा विचार नहीं है। यह स्पष्ट करता है कि आपका इरादा क्या है, इसलिए यह कोड पठनीयता में सुधार करता है।
छिपकली

68
"use strict";

var constants = Object.freeze({
    "π": 3.141592653589793 ,
    "e": 2.718281828459045 ,
    "i": Math.sqrt(-1)
});

constants.π;        // -> 3.141592653589793
constants = 3;    // -> TypeError: Cannot assign to read only property 'π' …
constants.π;        // -> 3.141592653589793

delete constants.π; // -> TypeError: Unable to delete property.
constants.π;        // -> 3.141592653589793

ऑब्जेक्ट देखें । यदि आप संदर्भ केवल पढ़ने के लिए चाहते हैंconst तो आप इसका उपयोग कर सकते हैंconstants


2
यह केवल IE9 + kangax.github.io/compat-table/es5 पर काम करता है उल्लेख करना चाहिए ।
कॉर्डल

मैं, अगर इसका टूटा हुआ क्रियान्वयन नहीं होताi
Alnitak

नोट: यह ES6 constघोषणा के समान है , उदाहरण के लिए गुणों को फिर से घोषित या फिर से असाइन नहीं किया जा सकता है, लेकिन यदि वे डेटाटाइप के हैं object, तो उन्हें उत्परिवर्तित किया जा सकता है।
le_m

ठीक वही जो मेरे द्वारा खोजा जा रहा था। चर को पुन: असाइन करने से रोकने के const constantsबजाय आप इसका उपयोग भी कर सकते हैं var constants
जरीट मिलार्ड

उदाहरण के लिए, पुनरावर्ती ठंड के लिए गहरा-फ्रीज
सैम

64

IE जैसे, कांस्टेंट का समर्थन करता है:

<script language="VBScript">
 Const IE_CONST = True
</script>
<script type="text/javascript">
 if (typeof TEST_CONST == 'undefined') {
    const IE_CONST = false;
 }
 alert(IE_CONST);
</script>

50
लड़का, ऐसी चीज़ के बारे में बात करें जो क्रॉस ब्राउज़र नहीं है। । । फिर भी बॉक्स के बाहर थोड़ा सोचने के लिए +1।
टॉम

14
VBScript? वह क्या है? ;)
tybro0103

2
मैं आमतौर पर IE विशिष्ट उत्तर के साथ सामान्य संबंधित क्रॉस ब्राउज़र प्रश्न के लिए वोट करता हूं। क्योंकि मैं उन लोगों से नफरत करता हूं जो सोचते हैं कि IE जावास्क्रिप्ट कार्यान्वयन 'एक' है, और दूसरों को केवल अनदेखा किया जाना है। IE, btw के अलावा अन्य बॉरोवर्स का उपयोग कौन कर रहा है?
चींटी

@Cooluhuru यह स्क्रिप्ट IE ब्राउज़र (VBScript का उपयोग करके) और गैर-IE ब्राउज़र (जावास्क्रिप्ट का उपयोग करके const) को संभालने के लिए प्रकट होती है । क्या आप बता सकते हैं कि इसमें क्या गलत है?
एंड्रयू ग्रिम

मेरे पास अभी भी एक कठिन समय है जो यह स्वीकार करता है कि स्थिरांक को बदला जा सकता है।
नोर्बर्ट नॉर्बर्टन

59

ECMAScript 5 परिचय Object.defineProperty:

Object.defineProperty (window,'CONSTANT',{ value : 5, writable: false });

यह हर आधुनिक ब्राउज़र (साथ ही IE। 9) में समर्थित है

इसे भी देखें: ES5 में Object.defineProperty?


1
यह ध्यान देने योग्य है कि यह एक पारंपरिक स्थिरांक की तरह नहीं है। यह आपको केवल एक निरंतर संपत्ति (एक गैर स्थिर वस्तु) को परिभाषित करने की अनुमति देगा। इसके अलावा यह एक त्रुटि उत्पन्न नहीं करता है और यहां तक ​​कि आपके द्वारा सेट किए गए प्रयास का मूल्य भी लौटाता है। यह केवल मूल्य नहीं लिखता है।
कोरी सकल 14

3
मैंने हाल ही में पढ़ा कि संपत्ति के साथ असाइन करने का प्रयास वास्तव में एक त्रुटि फेंक writable: false देगा यदि कोड जो असाइनमेंट करता है उसे ECMAScript 5 के सख्त मोड के तहत व्याख्या किया जा रहा है। 'use strict'अपने कोड में लिखने का सिर्फ एक और कारण ।
कोरी सकल

6
आप वास्तव में चूक सकते हैं writable: falseक्योंकि यह डिफ़ॉल्ट है
सैम

24

नहीं, सामान्य तौर पर नहीं। फ़ायरफ़ॉक्स लागू करता है, constलेकिन मुझे पता है कि IE नहीं है।


@ जॉन कॉन्स के लिए एक सामान्य नामकरण अभ्यास की ओर इशारा करता है जो अन्य भाषाओं में वर्षों से उपयोग किया जाता है, मुझे कोई कारण नहीं दिखता है कि आप इसका उपयोग क्यों नहीं कर सकते। निश्चित रूप से इसका मतलब यह नहीं है कि कोई भी वैरिएबल के मूल्य पर नहीं लिखेगा। :)


11
जैसा कि सभी जानते हैं, यदि IE इसे लागू नहीं करता है, तो यह मौजूद नहीं हो सकता है।
जोश हिनमैन

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

@ रिच: किसने कहा कि मेरी राय तथ्य था? आपने काफी धारणा बना ली। इसके अलावा, जहां तक ​​मेरा सवाल है, यह तथ्य कि IE चूसना एक तथ्य है। आपके अपने तथ्य हो सकते हैं, मैंने नहीं कहा कि आपको मेरा विश्वास करना चाहिए। : P एक Xanax या कुछ और ...
जेसन बंटिंग

@ रीच बी, जो कि सिर्फ एक विनम्र टिप्पणी थी, और मुझ पर विश्वास करो, मुझे पता होगा, मैं बहुत से गूंगा टिप्पणी करता हूं। @ जेसन बी - दिलचस्प है, मैं कल रात इस समस्या में भाग गया .. कास्ट एफएफ में काम किया, लेकिन आईई नहीं। स्पष्टीकरण के लिए धन्यवाद

IE के बारे में कौन परवाह करता है? मैं नही! एफएफ या क्रोम या ओपेरा आदि ... लगभग हर ओएस प्लेटफॉर्म में स्थापित किया जा सकता है। साथ ही कंप्यूटर रिटेलर्स आमतौर पर पुराने IE संस्करण को जानते हैं, इसलिए वे अक्सर (या हर बार भी) कंप्यूटर बेचने से पहले वैकल्पिक ब्राउज़र इंस्टॉल करते हैं। इसलिए मैंने अपने विकसित ऐप के लिए असंगत ब्राउज़रों की परवाह नहीं करने का फैसला किया है: यदि ब्राउज़र डेवलपर्स मानकों का सम्मान करने के बारे में परवाह करते हैं कि उनका उत्पाद मेरे ऐप का उपयोग कर सकता है, यदि नहीं, तो उपयोगकर्ता एक अलग ब्राउज़र का उपयोग करेंगे ... मैं इसके साथ रह सकता हूं; -) लेकिन क्या Microsoft बाजार का हिस्सा खो सकता है? नहीं, वे ऐसा नहीं कर सकते "वे" अपने देव राजनीतिक बदल देंगे!
विली जीका

20

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

function MY_CONSTANT() {
   return "some-value";
}


alert(MY_CONSTANT());

6
इस बात की ओर इशारा करते हुए कि यह @Burkes जवाब (@trinithis 'टिप्पणी) में वर्णित एक ही समस्या में है। `MY_CONSTANT = function () {रिटर्न" कुछ-अन्य-मूल्य "; } इसे तोड़ता है। +1 हालांकि, सभ्य और त्वरित समाधान।
पैट्रिक एम।

13
-1। यह SOME_NAME = मान पर कोई लाभ नहीं है (यह अभी भी परिवर्तनशील है), अधिक कोड है, और समझाने की आवश्यकता है।
मिकमेकाना

@PatrickM जबकि यह सच है कि आप उस तरह के छद्म-स्थिरांक को संशोधित कर सकते हैं, जैसे अन्य भाषाओं में, जैसे C, जिस पर आपको स्थिरांक को संशोधित करने में सक्षम नहीं होना चाहिए , आप इसे अभी भी उदाहरण के बिंदुओं के माध्यम से कर सकते हैं। इसलिए जब तक आप कुछ दृष्टिकोण का उपयोग करते हैं जो कम से कम यह बताता है कि यह एक स्थिर है, तो यह ठीक है।
11:28 पर

20

मोज़िला एमडीएन वेब डॉक्स में अच्छे उदाहरण और स्पष्टीकरण हैं const। अंश:

// define MY_FAV as a constant and give it the value 7
const MY_FAV = 7;

// this will throw an error - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;

लेकिन यह दुखद है कि IE9 / 10 अभी भी समर्थन नहीं करता है const। और इसका कारण बेतुका है :

तो, IE9 कांस्ट के साथ क्या कर रहा है? अब तक, हमारा निर्णय इसका समर्थन नहीं करना था। यह अभी तक सर्वसम्मति नहीं है क्योंकि यह सभी ब्राउज़रों पर कभी उपलब्ध नहीं है।

...

अंत में, ऐसा लगता है कि वेब के लिए सबसे अच्छा दीर्घकालिक समाधान है कि इसे छोड़ दिया जाए और अपने पाठ्यक्रम को चलाने के लिए मानकीकरण प्रक्रियाओं का इंतजार किया जाए।

वे इसे लागू नहीं करते हैं क्योंकि अन्य ब्राउज़रों ने इसे सही तरीके से लागू नहीं किया है ?! इसे बेहतर बनाने से बहुत डर लगता है? मानक परिभाषाएँ या नहीं, एक स्थिरांक एक स्थिर है: एक बार सेट, कभी नहीं बदला।

और सभी विचारों के लिए: प्रत्येक फ़ंक्शन को अधिलेखित (XSS आदि) किया जा सकता है। तो में कोई अंतर नहीं है varया function(){return}constएकमात्र वास्तविक स्थिरांक है।

अद्यतन: IE11 का समर्थन करता है const :

IE11 देना, सहित उभरते ECMAScript 6 मानक की अच्छी तरह से परिभाषित और आमतौर पर इस्तेमाल किया सुविधाओं के लिए समर्थन शामिल const, Map, Set, और WeakMap, साथ ही __proto__के लिए बेहतर अंतर।


25
"यह सभी ब्राउज़रों पर कभी उपलब्ध नहीं था"। यदि आप इसे IE में उपलब्ध नहीं कराते हैं तो यह सभी ब्राउज़रों में कभी नहीं होगा।
KM1

ड्राइविंग मानकीकरण हर किसी के लिए नहीं है;) - कंपनियां आती हैं और वे फिर से जाती हैं - लकड़ी में बाधाओं को उद्धृत करने के लिए धन्यवाद
क्विक

इस पर एक और: वीबीए अभी तक सभी ब्राउज़रों में कंसूस फ़ीचर नहीं है और एमएस वीबीए में कांस्ट का समर्थन करता है - यह चैनल के विकास के बजट की महारत है;)
क्विक

17

यदि आप कार्यों का उपयोग करने में कोई आपत्ति नहीं करते हैं:

var constant = function(val) {
   return function() {
        return val;
    }
}

यह दृष्टिकोण आपको नियमित चर के बजाय फ़ंक्शंस देता है, लेकिन यह * गारंटी देता है कि कोई भी इसके सेट होने पर मूल्य को बदल नहीं सकता है।

a = constant(10);

a(); // 10

b = constant(20);

b(); // 20

मुझे व्यक्तिगत रूप से यह सुखद लगता है, विशेष रूप से नॉकआउट वेधशालाओं से इस पैटर्न का उपयोग करने के बाद।

* जब तक किसी ने constantआपको फोन करने से पहले फ़ंक्शन को फिर से परिभाषित नहीं किया


1
underscore.js इस कोड के समान एक स्थिर फ़ंक्शन लागू करता है।
अपराह्न

ओपी के सवाल की भावना को सरल, संक्षिप्त और उत्तर देता है। यह अधिक upVotes प्राप्त करना चाहिए था।
मैक

3
यह वास्तव में मेरे लिए कभी काम नहीं किया। भले ही बंद करने से यह अपरिवर्तनीय हो जाता है, लेकिन आपके द्वारा इसे असाइन किया गया संस्करण अभी भी ओवरराइट किया जा सकता है। Ex: a = constant(10); a(10); // 10इसके बाद a = constant(25); a(); //25, कोई त्रुटि या चेतावनी नहीं दी गई है, कोई संकेत नहीं है कि आपका निरंतर टूट गया है।
पैट्रिक एम।

यदि मैं मान को पुन: सौंपता हूं aतो यह नए मूल्य में बदल जाता है
सौरभ शर्मा

17

"नई" ऑब्जेक्ट एपीआई के साथ आप कुछ इस तरह से कर सकते हैं:

var obj = {};
Object.defineProperty(obj, 'CONSTANT', {
  configurable: false
  enumerable: true,
  writable: false,
  value: "your constant value"
});

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

Object.defineProperty(this, 'constant', {
  enumerable: true, 
  writable: false, 
  value: 7, 
  configurable: false
});

> constant
=> 7
> constant = 5
=> 7

नोट: असाइनमेंट आपको कंसोल में दिए गए मान को वापस देगा, लेकिन चर का मूल्य नहीं बदलेगा


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

2
'सफारी में काम नहीं कर रहा', सफारी में समर्थित नहीं । एक ही नहीं। और यह एक 'अनकैप्ड टाइपर्रोर: नॉट रिडिफाइन प्रॉपर्टी: <प्रॉपर्टी नेम>> अगर आप कोशिश करें तो इसे फेंक देना चाहिए। या तो आप इसे गलत कर रहे हैं, या आपके ff ने इसे गलत तरीके से लागू किया है। मुझे लगता है कि यह दोनों का मिश्रण है।
दसवें दशक

14

जहाँ संभव हो वहाँ संरचनाओं में समूह स्थिरांक:

उदाहरण, मेरे वर्तमान गेम प्रोजेक्ट में, मैंने नीचे उपयोग किया है:

var CONST_WILD_TYPES = {
    REGULAR: 'REGULAR',
    EXPANDING: 'EXPANDING',
    STICKY: 'STICKY',
    SHIFTING: 'SHIFTING'
};

नियत कार्य:

var wildType = CONST_WILD_TYPES.REGULAR;

तुलना:

if (wildType === CONST_WILD_TYPES.REGULAR) {
    // do something here
}

हाल ही में मैं तुलना के लिए उपयोग कर रहा हूं:

switch (wildType) {
    case CONST_WILD_TYPES.REGULAR:
        // do something here
        break;
    case CONST_WILD_TYPES.EXPANDING:
        // do something here
        break;
}

IE11 नए ES6 मानक के साथ है जिसमें 'const' घोषणा है।
ऊपर IE8, IE9 और IE10 जैसे पहले के ब्राउज़रों में काम करता है।


12

आप अपनी स्क्रिप्ट को आसानी से स्थिरांक के लिए एक तंत्र से लैस कर सकते हैं जो सेट किया जा सकता है लेकिन बदल नहीं सकता है। उन्हें बदलने का प्रयास एक त्रुटि उत्पन्न करेगा।

/* author Keith Evetts 2009 License: LGPL  
anonymous function sets up:  
global function SETCONST (String name, mixed value)  
global function CONST (String name)  
constants once set may not be altered - console error is generated  
they are retrieved as CONST(name)  
the object holding the constants is private and cannot be accessed from the outer script directly, only through the setter and getter provided  
*/

(function(){  
  var constants = {};  
  self.SETCONST = function(name,value) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if (!value) { throw new Error(' no value supplied for constant ' + name); }  
      else if ((name in constants) ) { throw new Error('constant ' + name + ' is already defined'); }   
      else {   
          constants[name] = value;   
          return true;  
    }    
  };  
  self.CONST = function(name) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if ( name in constants ) { return constants[name]; }    
      else { throw new Error('constant ' + name + ' has not been defined'); }  
  };  
}())  


// -------------  demo ----------------------------  
SETCONST( 'VAT', 0.175 );  
alert( CONST('VAT') );


//try to alter the value of VAT  
try{  
  SETCONST( 'VAT', 0.22 );  
} catch ( exc )  {  
   alert (exc.message);  
}  
//check old value of VAT remains  
alert( CONST('VAT') );  


// try to get at constants object directly  
constants['DODO'] = "dead bird";  // error  

12

IE को भूल जाओ और constकीवर्ड का उपयोग करें ।


9
मेरे लिये कार्य करता है! लेकिन फिर मैं एक क्रोम एक्सटेंशन लिख रहा हूं, इसलिए मुझे पता है कि मैं एक समझदार ब्राउज़र पर हूं ...
yoyo

1
एक्सटेंशन और एडोनस लिखने के बारे में @yoyo सबसे अच्छा हिस्सा - कोई क्रॉस-ब्राउज़र समर्थन नहीं!
इयान

1
@Ian 2019 में आपका स्वागत है, क्रॉस-ब्राउज़र असंगति लगभग गायब हो गई है :)
Fusseldieb

9

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

लेकिन मैं अन्य चर से अलग करने के लिए नाम स्थान का उपयोग करने का सुझाव दूंगा। यह अन्य चरों से न्यूनतम टकराने की संभावना को कम करेगा।

जैसे उचित नाम स्थान

var iw_constant={
     name:'sudhanshu',
     age:'23'
     //all varibale come like this
}

इसलिए इसका उपयोग करते समय iw_constant.nameयाiw_constant.age

आप किसी भी नई कुंजी को जोड़ने या ऑब्जेक्ट.फ्रीज विधि का उपयोग करके iw_constant के अंदर किसी भी कुंजी को बदल सकते हैं। हालाँकि यह विरासत ब्राउज़र पर समर्थित नहीं है।

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

Object.freeze(iw_constant);

पुराने ब्राउज़र के लिए आप फ्रीज़ विधि के लिए पॉलीफिल का उपयोग कर सकते हैं ।


यदि आप कॉलिंग फ़ंक्शन के साथ ठीक हैं, तो निरंतर परिभाषित करने के लिए सबसे अच्छा क्रॉस ब्राउज़र तरीका है। एक स्व निष्पादित कार्य के भीतर अपनी वस्तु को स्कूप करना और अपने स्थिरांक पूर्व के लिए एक फ़ंक्शन प्राप्त करना

var iw_constant= (function(){
       var allConstant={
             name:'sudhanshu',
             age:'23'
             //all varibale come like this

       };

       return function(key){
          allConstant[key];
       }
    };

// मान का उपयोग करने के लिए iw_constant('name')याiw_constant('age')


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


7

कुछ समय के लिए, मैंने "स्थिरांक" (जो अभी भी वास्तव में स्थिरांक नहीं थे) को निर्दिष्ट किया, वस्तु शाब्दिक में with()बयानों से गुजरता है । मुझे लगा कि यह बहुत चालाक है। यहाँ एक उदाहरण है:

with ({
    MY_CONST : 'some really important value'
}) {
    alert(MY_CONST);
}

अतीत में, मैंने एक CONSTनाम स्थान भी बनाया है जहाँ मैं अपने सभी स्थिरांक लगाऊंगा। फिर, ओवरहेड के साथ। शीश।

अब, मैं बस करो var MY_CONST = 'whatever';करने के लिए KISS


16
अगर कुछ बुराई से अधिक बुराई है, यह निश्चित रूप से है with
14

4
eval बहुत बुराई है! इसने एक बार मेरे घर को जला दिया!
डब्ल्यू

6

मेरी राय (केवल वस्तुओं के साथ काम करती है)।

var constants = (function(){
  var a = 9;

  //GLOBAL CONSTANT (through "return")
  window.__defineGetter__("GCONST", function(){
    return a;
  });

  //LOCAL CONSTANT
  return {
    get CONST(){
      return a;
    }
  }
})();

constants.CONST = 8; //9
alert(constants.CONST); //9

प्रयत्न! लेकिन समझें - यह ऑब्जेक्ट है, लेकिन सरल चर नहीं है।

बस कोशिश भी करें:

const a = 9;

5

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

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

तो मैं इस समाधान के साथ आया:

अनाम फ़ंक्शन के अंदर अपना सब कुछ रखें ताकि क्लाइंट पक्ष द्वारा चर, ऑब्जेक्ट आदि को बदला नहीं जा सके। अन्य कार्यों को अंदर से 'वास्तविक' कार्यों को कॉल करके 'वास्तविक' कार्यों को भी छिपाएं। मैंने यह देखने के लिए फ़ंक्शन का उपयोग करने के बारे में भी सोचा कि क्या ग्राहक द्वारा किसी फ़ंक्शन को बदल दिया गया है। यदि फ़ंक्शन बदल दिए गए हैं, तो उन्हें उन चर का उपयोग करके वापस बदलें जो अंदर पर 'संरक्षित' हैं और जिन्हें बदला नहीं जा सकता है।

/*Tested in: IE 9.0.8; Firefox 14.0.1; Chrome 20.0.1180.60 m; Not Tested in Safari*/

(function(){
  /*The two functions _define and _access are from Keith Evetts 2009 License: LGPL (SETCONST and CONST).
    They're the same just as he did them, the only things I changed are the variable names and the text
    of the error messages.
  */

  //object literal to hold the constants
  var j = {};

  /*Global function _define(String h, mixed m). I named it define to mimic the way PHP 'defines' constants.
    The argument 'h' is the name of the const and has to be a string, 'm' is the value of the const and has
    to exist. If there is already a property with the same name in the object holder, then we throw an error.
    If not, we add the property and set the value to it. This is a 'hidden' function and the user doesn't
    see any of your coding call this function. You call the _makeDef() in your code and that function calls
    this function.    -    You can change the error messages to whatever you want them to say.
  */
  self._define = function(h,m) {
      if (typeof h !== 'string') { throw new Error('I don\'t know what to do.'); }
      if (!m) { throw new Error('I don\'t know what to do.'); }
      else if ((h in j) ) { throw new Error('We have a problem!'); }
      else {
          j[h] = m;
          return true;
    }
  };

  /*Global function _makeDef(String t, mixed y). I named it makeDef because we 'make the define' with this
    function. The argument 't' is the name of the const and doesn't need to be all caps because I set it
    to upper case within the function, 'y' is the value of the value of the const and has to exist. I
    make different variables to make it harder for a user to figure out whats going on. We then call the
    _define function with the two new variables. You call this function in your code to set the constant.
    You can change the error message to whatever you want it to say.
  */
  self._makeDef = function(t, y) {
      if(!y) { throw new Error('I don\'t know what to do.'); return false; }
      q = t.toUpperCase();
      w = y;
      _define(q, w);
  };

  /*Global function _getDef(String s). I named it getDef because we 'get the define' with this function. The
    argument 's' is the name of the const and doesn't need to be all capse because I set it to upper case
    within the function. I make a different variable to make it harder for a user to figure out whats going
    on. The function returns the _access function call. I pass the new variable and the original string
    along to the _access function. I do this because if a user is trying to get the value of something, if
    there is an error the argument doesn't get displayed with upper case in the error message. You call this
    function in your code to get the constant.
  */
  self._getDef = function(s) {
      z = s.toUpperCase();
      return _access(z, s);
  };

  /*Global function _access(String g, String f). I named it access because we 'access' the constant through
    this function. The argument 'g' is the name of the const and its all upper case, 'f' is also the name
    of the const, but its the original string that was passed to the _getDef() function. If there is an
    error, the original string, 'f', is displayed. This makes it harder for a user to figure out how the
    constants are being stored. If there is a property with the same name in the object holder, we return
    the constant value. If not, we check if the 'f' variable exists, if not, set it to the value of 'g' and
    throw an error. This is a 'hidden' function and the user doesn't see any of your coding call this
    function. You call the _getDef() function in your code and that function calls this function.
    You can change the error messages to whatever you want them to say.
  */
  self._access = function(g, f) {
      if (typeof g !== 'string') { throw new Error('I don\'t know what to do.'); }
      if ( g in j ) { return j[g]; }
      else { if(!f) { f = g; } throw new Error('I don\'t know what to do. I have no idea what \''+f+'\' is.'); }
  };

  /*The four variables below are private and cannot be accessed from the outside script except for the
    functions inside this anonymous function. These variables are strings of the four above functions and
    will be used by the all-dreaded eval() function to set them back to their original if any of them should
    be changed by a user trying to hack your code.
  */
  var _define_func_string = "function(h,m) {"+"      if (typeof h !== 'string') { throw new Error('I don\\'t know what to do.'); }"+"      if (!m) { throw new Error('I don\\'t know what to do.'); }"+"      else if ((h in j) ) { throw new Error('We have a problem!'); }"+"      else {"+"          j[h] = m;"+"          return true;"+"    }"+"  }";
  var _makeDef_func_string = "function(t, y) {"+"      if(!y) { throw new Error('I don\\'t know what to do.'); return false; }"+"      q = t.toUpperCase();"+"      w = y;"+"      _define(q, w);"+"  }";
  var _getDef_func_string = "function(s) {"+"      z = s.toUpperCase();"+"      return _access(z, s);"+"  }";
  var _access_func_string = "function(g, f) {"+"      if (typeof g !== 'string') { throw new Error('I don\\'t know what to do.'); }"+"      if ( g in j ) { return j[g]; }"+"      else { if(!f) { f = g; } throw new Error('I don\\'t know what to do. I have no idea what \\''+f+'\\' is.'); }"+"  }";

  /*Global function _doFunctionCheck(String u). I named it doFunctionCheck because we're 'checking the functions'
    The argument 'u' is the name of any of the four above function names you want to check. This function will
    check if a specific line of code is inside a given function. If it is, then we do nothing, if not, then
    we use the eval() function to set the function back to its original coding using the function string
    variables above. This function will also throw an error depending upon the doError variable being set to true
    This is a 'hidden' function and the user doesn't see any of your coding call this function. You call the
    doCodeCheck() function and that function calls this function.    -    You can change the error messages to
    whatever you want them to say.
  */
  self._doFunctionCheck = function(u) {
      var errMsg = 'We have a BIG problem! You\'ve changed my code.';
      var doError = true;
      d = u;
      switch(d.toLowerCase())
      {
           case "_getdef":
               if(_getDef.toString().indexOf("z = s.toUpperCase();") != -1) { /*do nothing*/ }
               else { eval("_getDef = "+_getDef_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_makedef":
               if(_makeDef.toString().indexOf("q = t.toUpperCase();") != -1) { /*do nothing*/ }
               else { eval("_makeDef = "+_makeDef_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_define":
               if(_define.toString().indexOf("else if((h in j) ) {") != -1) { /*do nothing*/ }
               else { eval("_define = "+_define_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_access":
               if(_access.toString().indexOf("else { if(!f) { f = g; }") != -1) { /*do nothing*/ }
               else { eval("_access = "+_access_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           default:
                if(doError === true) { throw new Error('I don\'t know what to do.'); }
      }
  };

  /*Global function _doCodeCheck(String v). I named it doCodeCheck because we're 'doing a code check'. The argument
    'v' is the name of one of the first four functions in this script that you want to check. I make a different
    variable to make it harder for a user to figure out whats going on. You call this function in your code to check
    if any of the functions has been changed by the user.
  */
  self._doCodeCheck = function(v) {
      l = v;
      _doFunctionCheck(l);
  };
}())

यह भी लगता है कि सुरक्षा वास्तव में एक समस्या है और क्लाइंट की तरफ से प्रोग्रामिंग को 'छिपाने' का कोई तरीका नहीं है। मेरे लिए एक अच्छा विचार यह है कि आप अपने कोड को संपीड़ित करें, ताकि आप, प्रोग्रामर सहित किसी को भी इसे पढ़ने और समझने में वास्तव में कठिन हो। : वहाँ एक साइट आप के लिए जा सकते है http://javascriptcompressor.com/ । (यह मेरी साइट नहीं है, चिंता मत करो मैं विज्ञापन नहीं कर रहा हूं।) यह एक ऐसी साइट है जो आपको मुफ्त में जावास्क्रिप्ट कोड को संक्षिप्त और संक्षिप्त करने देगी।

  1. उपरोक्त स्क्रिप्ट में सभी कोड को कॉपी करें और इसे javascriptcompressor.com पेज पर शीर्ष टेक्स्टारिया में पेस्ट करें।
  2. Base62 एनकोड चेकबॉक्स चेक करें, श्रिंक वेरिएबल्स चेकबॉक्स चेक करें।
  3. कंप्रेस बटन दबाएं।
  4. पेस्ट करें और इसे .js फ़ाइल में सहेजें और इसे अपने पृष्ठ के प्रमुख में अपने पृष्ठ में जोड़ें।

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

5

स्पष्ट रूप से यह एक मानकीकृत क्रॉस-ब्राउज़र कॉन्स्टेबल कीवर्ड की आवश्यकता को दर्शाता है।

पर अभी के लिए:

var myconst = value;

या

Object['myconst'] = value;

दोनों पर्याप्त लगते हैं और कुछ भी एक बाज़ू के साथ एक मक्खी की शूटिंग की तरह है।


अच्छा पुराना var myconst = value लें; और डिबगिंग के लिए अतिरिक्त डिबगिंग कोड का उपयोग करें ... - जब तक सभी ब्राउज़र कॉन्स्टैग का समर्थन नहीं करते तब तक पागल की तरह काम करता है
क्विक

4

मैं अपनी Greasemonkey स्क्रिप्ट के constबजाय उपयोग करता varहूं, लेकिन यह इसलिए है क्योंकि वे केवल फ़ायरफ़ॉक्स पर चलेंगे ...
नाम सम्मेलन वास्तव में जाने का तरीका हो सकता है, (मैं दोनों करते हैं!)।


4

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

उदाहरण के लिए, कोई निम्नलिखित दिनांक API को लागू कर सकता है:

date.add(5, MyModule.Date.DAY).add(12, MyModule.Date.HOUR)

लेकिन यह केवल लिखने के लिए बहुत कम और स्वाभाविक है:

date.add(5, "days").add(12, "hours")

इस तरह "दिन" और "घंटे" वास्तव में स्थिरांक की तरह काम करते हैं, क्योंकि आप बाहर से नहीं बदल सकते हैं कितने सेकंड "घंटे" का प्रतिनिधित्व करता है। लेकिन इसे ओवरराइट करना आसान है MyModule.Date.HOUR

इस तरह का दृष्टिकोण डिबगिंग में भी मदद करेगा। अगर फायरबग आपको बताता action === 18है कि इसका क्या मतलब है यह पता लगाना बहुत कठिन है, लेकिन जब आप देखते हैं action === "save"तो यह तुरंत स्पष्ट होता है।


वर्तनी की गलतियाँ करना दुर्भाग्य से बहुत आसान है - जैसे - "Hours"इसके बजाय "hours"- लेकिन एक IDE आपको यह बता सकता है कि उस पर जल्दी Date.Hoursपरिभाषित नहीं किया गया है।
le_m

4

ठीक है, यह बदसूरत है, लेकिन यह मुझे सफारी और ओपेरा में एक निरंतर निरंतर (डब्ल्यूटीएफ) फ़ायरफ़ॉक्स और क्रोमियम में एक निरंतरता देता है, और आईई में एक चर।

बेशक () बुराई है, लेकिन इसके बिना, IE एक त्रुटि फेंकता है, स्क्रिप्ट को चलने से रोकता है।

सफ़ारी और ओपेरा कॉन्स्टेबल कीवर्ड का समर्थन करते हैं, लेकिन आप कॉन्स का मान बदल सकते हैं

इस उदाहरण में, सर्वर-साइड कोड पृष्ठ पर जावास्क्रिप्ट लिख रहा है, मान के साथ {0} की जगह।

try{
    // i can haz const?
    eval("const FOO='{0}';");
    // for reals?
    var original=FOO;
    try{
        FOO='?NO!';
    }catch(err1){
        // no err from Firefox/Chrome - fails silently
        alert('err1 '+err1);
    }
    alert('const '+FOO);
    if(FOO=='?NO!'){
        // changed in Sf/Op - set back to original value
        FOO=original;
    }
}catch(err2){
    // IE fail
    alert('err2 '+err2);
    // set var (no var keyword - Chrome/Firefox complain about redefining const)
    FOO='{0}';
    alert('var '+FOO);
}
alert('FOO '+FOO);

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

फ़ायरफ़ॉक्स 2, 3, 3.6, 4, आयरन 8, क्रोम 10, 12, ओपेरा 11, सफारी 5, आईई 6, 9 के साथ परीक्षण किया गया।


1
उस कोड को प्यार करो! बदसूरत के रूप में बदसूरत, लेकिन कास्ट समर्थन के लिए एक अच्छा परीक्षण। =)
स्टेन जी। स्ट्रिंडहग

1
कुछ हद तक मज़ेदार, आंख - आप एक कॉन्सेप्ट घोषित करने के लिए कितनी लाइनें टाइप कर सकते हैं?
तेज

4

यदि यह ध्यान देने योग्य है, तो आप कोणीय का उपयोग करके स्थिरांक को परिभाषित कर सकते हैं$provide.constant()

angularApp.constant('YOUR_CONSTANT', 'value');

अप ... और आप VBA में स्थिरांक ... xbrowser उपयोग कर सकते हैं ... ...;)
जल्दी

ओपी जावास्क्रिप्ट के बारे में पूछता है, विशिष्ट भारी राय वाले जेएस फ्रेमवर्क के साथ उत्तर का सौदा करता है। व्यावहारिक रूप से ऑफ-टॉपिक।
rounce

2
@ क्रूस: ऑफ-टॉपिक उत्तर अभी भी उत्तर हैं, उन्हें फ्लैग न करें, न कि उत्तर के रूप में बल्कि डाउनवोट और वोट के बजाय डिलीट करने के लिए। देखें कि मैं "उत्तर नहीं" ध्वज का ठीक से उपयोग कैसे करूं?
केविन गुआन

@ केविनगुआन नोटेड, भविष्य में करेगा।
उछाल

4

बर्क के उत्तर का एक उन्नत संस्करण जो आपको इसके CONFIG.MY_CONSTबजाय करने देता है CONFIG.get('MY_CONST')

इसके लिए IE9 + या एक वास्तविक वेब ब्राउज़र की आवश्यकता होती है।

var CONFIG = (function() {
    var constants = {
        'MY_CONST': 1,
        'ANOTHER_CONST': 2
    };

    var result = {};
    for (var n in constants)
        if (constants.hasOwnProperty(n))
            Object.defineProperty(result, n, { value: constants[n] });

    return result;
}());

* गुण केवल-पढ़े जाते हैं, केवल तभी जब प्रारंभिक मूल्य अपरिवर्तनीय हों।


4

जावास्क्रिप्ट ईएस 6 (पुनः) ने उस constकीवर्ड को पेश किया जो सभी प्रमुख ब्राउज़रों में समर्थित है

के माध्यम से घोषित चर को constफिर से घोषित या फिर से असाइन नहीं किया जा सकता है।

इसके अलावा, के constसमान व्यवहार करता है let

यह आदिम डेटाैटिप्स (बूलियन, नल, अनिर्धारित, संख्या, स्ट्रिंग, प्रतीक) के लिए अपेक्षित व्यवहार करता है:

const x = 1;
x = 2;
console.log(x); // 1 ...as expected, re-assigning fails

ध्यान: वस्तुओं के बारे में नुकसान के बारे में पता होना:

const o = {x: 1};
o = {x: 2};
console.log(o); // {x: 1} ...as expected, re-assigning fails

o.x = 2;
console.log(o); // {x: 2} !!! const does not make objects immutable!

const a = [];
a = [1];
console.log(a); // 1 ...as expected, re-assigning fails

a.push(1);
console.log(a); // [1] !!! const does not make objects immutable

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


से IE11 केवल :-(
मो

3

एक अन्य विकल्प कुछ इस प्रकार है:

var constants = {
      MY_CONSTANT : "myconstant",
      SOMETHING_ELSE : 123
    }
  , constantMap = new function ConstantMap() {};

for(var c in constants) {
  !function(cKey) {
    Object.defineProperty(constantMap, cKey, {
      enumerable : true,
      get : function(name) { return constants[cKey]; }
    })
  }(c);
}

फिर बस: var foo = constantMap.MY_CONSTANT

यदि आप constantMap.MY_CONSTANT = "bar"ऐसा करते तो इसका कोई प्रभाव नहीं पड़ता, क्योंकि हम एक असाइनमेंट ऑपरेटर को एक गेट्टर के साथ उपयोग करने की कोशिश कर रहे हैं, इसलिए constantMap.MY_CONSTANT === "myconstant"यह सच रहेगा।


3

जावास्क्रिप्ट में पहले से ही मौजूद है स्थिरांक । आप इस तरह एक स्थिरांक परिभाषित करते हैं:

const name1 = value;

यह पुनर्मूल्यांकन के माध्यम से नहीं बदल सकता है।


उत्तर में लिंक के अनुसार, यह एक प्रयोगात्मक विशेषता है और सावधानी के साथ इसका उपयोग किया जाना चाहिए।
जॉनी कर्र

बेशक, मैं आपसे सहमत हूं। लेकिन ब्राउज़रों के अंतिम संस्करणों में यह काम करता है।
एरिक लुसियो

3

कीवर्ड 'कॉन्स्ट' पहले प्रस्तावित किया गया था और अब इसे आधिकारिक रूप से ईएस 6 में शामिल किया गया है। Const कीवर्ड का उपयोग करके, आप एक मान / स्ट्रिंग पास कर सकते हैं जो एक अपरिवर्तनीय स्ट्रिंग के रूप में कार्य करेगा।


2

जावास्क्रिप्ट में स्थिरांक प्रस्तुत करना सबसे अच्छा हैक है।

जावास्क्रिप्ट में लगातार और विश्व स्तर पर सुलभ मूल्यों को बनाने का एक अच्छा तरीका कुछ "रीड-ओनली" के साथ एक वस्तु शाब्दिक घोषित करना होगा:

            my={get constant1(){return "constant 1"},
                get constant2(){return "constant 2"},
                get constant3(){return "constant 3"},
                get constantN(){return "constant N"}
                }

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

           my.constant1; >> "constant 1" 
           my.constant1 = "new constant 1";
           my.constant1; >> "constant 1" 

जैसा कि हम देख सकते हैं, "my.constant1" संपत्ति ने अपने मूल मूल्य को संरक्षित किया है। आपने खुद को कुछ अच्छा 'हरा' अस्थायी स्थिरांक बना लिया है ...

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

वरना मुझे अभी भी लगता है कि कॉन्स्टेंट डमी के लिए हैं। और मुझे अभी भी लगता है कि भ्रामक सुरक्षा के एक छोटे से कोने के लिए अपनी महान स्वतंत्रता का आदान-प्रदान करना सबसे खराब व्यापार संभव है।


2

Rhino.jsconstउपर्युक्त के अलावा क्या लागू किया गया था।

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