জাভাস্ক্রিপ্ট এ ধ্রুবক আছে?


1132

জাভাস্ক্রিপ্টে ধ্রুবক ব্যবহার করার কোনও উপায় আছে ?

যদি তা না হয় তবে ধ্রুবক হিসাবে ব্যবহৃত ভেরিয়েবলগুলি নির্দিষ্ট করার জন্য সাধারণ অভ্যাসটি কী?


35
Chromeconstধ্রুবক ব্যবহার করতে আপনাকে কীওয়ার্ডটি ব্যবহার করতে দেয় । যেমন const ASDF = "asdf"। তবে, যেহেতু constমাল্টি ব্রাউজারটি সামঞ্জস্যপূর্ণ নয়, তাই আমি সাধারণত একটি varঘোষণা দিয়ে থাকি ।
জ্যাকসনকর

20
try{const thing=1091;}catch(e){var thing=1091;}কাজ করে।
ডেরেক 朕 會

13
ডেরেক: আপনি চেষ্টা / ধরা ব্লককে যে জিনিসটি ঘোষনা করছেন তাতে কি আপনার চেষ্টা / ধরার পরিধি সীমাবদ্ধ রাখবে না? আপনি যদি সঠিকভাবে স্কোপিং না করে থাকেন তবে নির্দিষ্ট করে constবা varআদৌ কী লাভ?
কোডার

8
বর্তমান বাস্তবায়নগুলিতে @ কোডেরার, এটি কাজ করবে, যেমনটি constএকই সুযোগ রয়েছে varএবং এটি ফাংশন-স্তর, ব্লক-স্তর নয়। পরিবর্তে আপনি যদি আসন্ন ECMAScript স্ট্যান্ডার্ডটি অনুসরণ করেন constতবে এর একই সুযোগ রয়েছে letযার অর্থ এটি কার্যকর হবে না won't
জ্যাস্পার

3
@ কোডারর ভুল ভাষা জাভাস্ক্রিপ্টের ভেরিয়েবলগুলি ফাংশনের সুযোগ। এটি সি নয়
ডগ 65536

উত্তর:


1018

ES2015 সাল থেকে , জাভাস্ক্রিপ্ট একটি ধারণা আছে const:

const MY_CONSTANT = "some-value";

এটি IE 8, 9 এবং 10 বাদে বেশ কয়েকটি ব্রাউজারে কাজ করবে । কারও কারও কাছে কঠোর মোড সক্ষম হওয়া দরকার ।

আপনি varযদি পুরানো ব্রাউজারগুলিকে সমর্থন করতে বা লিগ্যাসি কোড নিয়ে কাজ করতে চান তবে নির্দিষ্ট মানগুলি সংশোধন করা উচিত নয় তা দেখাতে আপনি ALL_CAPS এর মতো সম্মেলনের সাহায্যে ব্যবহার করতে পারেন :

var MY_CONSTANT = "some-value";

60
কনস্ট এক্স = 24 সম্পর্কে কীভাবে;
জ্যাচারি স্কট

93
মনে রাখবেন যে আপনার যদি ক্রস-ব্রাউজারের সামঞ্জস্যতা না প্রয়োজন (বা আপনি রাইনো বা নোড.জেজে সার্ভার-সাইড প্রোগ্রামিং) করেন তবে আপনি constকীওয়ার্ডটি ব্যবহার করতে পারেন । এটি বর্তমানে আইই ব্যতীত সমস্ত আধুনিক ব্রাউজার দ্বারা সমর্থিত।
হুস্কি

17
এই দিনগুলিতে (3.5 বছর পরে) আপনি Object.definePropertyকেবল-পঠনযোগ্য বৈশিষ্ট্য তৈরি করতে ব্যবহার করতে পারেন যা মুছা যায় না। এটি সমস্ত বড় ব্রাউজারের বর্তমান সংস্করণে (তবে আই 8 তে ভুলভাবে ) কাজ করে। @ নোটানামের উত্তর দেখুন
ফ্রোগজ

12
@ অ্যামথ এটি সত্যিই সহায়ক নয়। এটি একক বিক্রেতার প্রস্তাবিত একটি স্টাইল গাইড । উপরের হুস্কির বক্তব্য অনুসারে, সার্ভার-সাইড জেএস লেখার সময় IE সামঞ্জস্যতা সম্পূর্ণ অপ্রাসঙ্গিক।
এেন্ড্রু

32
যেহেতু ২০১৫ সালে এই উত্তরটি এখনও গুগল দ্বারা উচ্চ র‌্যাঙ্কে রয়েছে তাই বলা উচিত যে এটি এখন অপ্রচলিত। constশব্দ এখন আনুষ্ঠানিকভাবে ভাষা অংশ এবং প্রত্যেক ব্রাউজার দ্বারা সমর্থিত। স্ট্যাটকাউনটার ডট কম অনুসারে ইন্টারনেট ব্যবহারকারীর মাত্র কয়েক শতাংশই পুরানো ব্রাউজার সংস্করণ ব্যবহার করেন যা সমর্থন করে না 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

এই পদ্ধতির ব্যবহার করে মানগুলি সংশোধন করা যায় না। তবে, আপনাকে কনফিগ: get () পদ্ধতিটি ব্যবহার করতে হবে :(।

আপনার যদি ভেরিয়েবলের মানটি কঠোরভাবে রক্ষা করার প্রয়োজন না হয়, তবে কেবলমাত্র প্রস্তাবিত হিসাবে করুন এবং সমস্ত ক্যাপগুলির একটি সম্মেলন ব্যবহার করুন।


13
নোট করুন যে আপনি কেবল কনফিগের মানটির জন্য কোনও ফাংশন ফিরিয়ে দিতে পারেন। এটি আপনাকে সর্বদা CONFIG.get () কল করতে বাঁচাতে পারে।
ম্যাথিউ বাইরেন

4
সুন্দর সমাধান। তবে এই জাতীয় জিনিসগুলি কোনও নতুন প্রকল্পে পুনরায় উদ্ভাবন না করার জন্য একটি লাইব্রেরি হিসাবে মোড়ানো উচিত।
andrii

82
CONFIG.get = someNewFunctionThatBreaksTheCode... সব মিলিয়ে আপনি একেবারে জেএস (ডাব্লু / ও কনট কিওয়ার্ড) এ ধ্রুবক প্রয়োগ করতে পারবেন না। কেবলমাত্র আপনি যা করতে পারেন তা হল সীমাবদ্ধতা সীমাবদ্ধ।
টমাস এডিং

28
আমি বিশ্বাস করি যে privateএটি জাভাস্ক্রিপ্টে ভবিষ্যতের সংরক্ষিত শব্দ, আমি যদি আপনি থাকতাম তবে আমি এটি ব্যবহার করতাম না।
Zaq

এটিও রেজিস্ট্রি প্যাটার্ন।

122

constশব্দ হয় ECMAScript প্রোগ্রামিং 6 খসড়া কিন্তু এটা দূর পর্যন্ত শুধুমাত্র ব্রাউজার সমর্থনের একটি পল্লবগ্রাহী ভোগ: http://kangax.github.io/compat-table/es6/ । বাক্য গঠনটি হ'ল:

const CONSTANT_NAME = 0;

13
আপনি যদি একটিতে কোনও মান নির্ধারণ করার চেষ্টা constকরেন তবে এটি কোনও ত্রুটি ফেলে না। অ্যাসাইনমেন্টটি কেবল ব্যর্থ হয় এবং ধ্রুবকের এখনও এর মূল মূল্য থাকে। এটি আইএমএইচওর একটি প্রধান ডিজাইনের ত্রুটি, তবে যতক্ষণ না কোনও স্পষ্ট, ধারাবাহিক নামকরণ কনভেনশন রয়েছে (যেমন জনপ্রিয় ALL_CAPS) আমি মনে করি না এটি খুব বেশি শোকের কারণ হয়ে উঠবে।
ম্যাট্রিক্সফ্রোগ

6
ব্রাউজার সহায়তায় এখানে নজর রাখুন: kangax.github.io/es5-compat-table/es6/#const
মার্ক ম্যাকডোনাল্ড

6
@ ম্যাট্রিক্সফ্রোগ অ্যাসাইনমেন্ট এর মাধ্যমে ত্রুটি বাড়িয়ে তুলবে 'use strict'
সাম

আমি কি কনস্ট্যান্টগুলি সংজ্ঞায়িত করব ALL CAPS?
লুইস

1
@ ট্রেডসিন এটি সমস্ত ক্যাপের ধ্রুবককে সংজ্ঞায়িত করার জন্য একটি সাধারণ নামকরণ কনভেনশন। ভাষার অনুমানের কিছুই এটিকে জোর করে না, তবে এটি কোনও খারাপ ধারণা নয়। এটি আপনার উদ্দেশ্য কী তা পরিষ্কার করে তোলে তাই কোড পাঠযোগ্যতার উন্নতি করে।
বিল করুন

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
অ্যালনিটাক

দ্রষ্টব্য: এটি ES6 constঘোষণার অনুরূপ আচরণ করে , উদাহরণস্বরূপ বৈশিষ্ট্যগুলি পুনরায় ঘোষিত বা পুনরায় বরাদ্দ করা যায় না, তবে তারা যদি ডেটাটাইপের হয় তবে সেগুলি objectপরিবর্তিত হতে পারে।
লে_ম

ঠিক আমি খুঁজছেন ছিল কি. ভেরিয়েবলটিকে পুনরায় নিয়োগ দেওয়া থেকে বিরত রাখতে আপনি 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
VB স্ক্রিপ্ট? ওটা কী? ;)
tybro0103

2
আইই নির্দিষ্ট উত্তর সহ আমি সাধারণত সম্পর্কিত ক্রস ব্রাউজারগুলির প্রশ্নের জন্য ভোট দিয়েছি। যেহেতু আমি এমন লোকদের ঘৃণা করি যারা মনে করে যে IE জাভাস্ক্রিপ্ট বাস্তবায়ন 'এক', এবং অন্যরা কেবল এড়ানো হবে to আইটি, বিটিডাব্লু ছাড়াও অন্য orণগ্রহীতা কে ব্যবহার করছেন?
পিপীলিকা

@ কুলুহুরু এই স্ক্রিপ্টটি আইই ব্রাউজারগুলি (ভিবিএস স্ক্রিপ্ট ব্যবহার করে) এবং নন-আইই ব্রাউজারগুলি (জাভাস্ক্রিপ্ট ব্যবহার করে const) উভয়ই পরিচালনা করবে । এর মধ্যে কী দোষ আছে তা আপনি ব্যাখ্যা করতে পারেন?
অ্যান্ড্রু গ্রিম

ধ্রুবকগুলি পরিবর্তন করা যেতে পারে তা স্বীকার করতে আমার এখনও একটি কঠিন সময় রয়েছে।
নরবার্ট নরবার্টসন

59

ইসমাস্ক্রিপ্ট 5 চালু করে Object.defineProperty:

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

এটি প্রতিটি আধুনিক ব্রাউজারে সমর্থিত (পাশাপাশি আইআই ≥ 9)।

আরও দেখুন: ইএস 5 এ অবজেক্ট.ডেফাইনপ্রপার্টি?


1
এটি লক্ষণীয় যে এটি কোনও গতানুগতিক ধ্রুবকের মতো নয়। এটি আপনাকে কেবল একটি ধ্রুবক সম্পত্তি (অ ধ্রুবক অবজেক্টের) সংজ্ঞা দিতে দেয় allow এছাড়াও এটি কোনও ত্রুটি তৈরি করে না এবং এমনকি আপনি যে মান সেট করার চেষ্টা করেছেন তাও প্রদান করে। এটি কেবল মান লিখে না।
কোরি গ্রস

3
আমি সম্প্রতি পড়া যে সঙ্গে একটি সম্পত্তি নির্ধারিত প্রয়াস writable: false হবে যদি কোডটি নিয়োগ করে এর নাম ECMAScript 5 এর কঠোর মোডে অধীনে ব্যাখ্যা করা হচ্ছে আসলে একটি ত্রুটি নিক্ষেপ করা। আপনার কোডটিতে লেখার আরও একটি কারণ 'use strict'
কোরি গ্রস

6
writable: falseযেটি ডিফল্ট তাই আপনি আসলে বাদ দিতে পারেন ।
স্যাম

24

না, সাধারণভাবে নয়। ফায়ারফক্স প্রয়োগ করে constতবে আমি জানি আইআই তা করে না।


@ জন অন্যান্য ভাষায় বছরের পর বছর ধরে ব্যবহৃত কনসুটগুলির জন্য একটি সাধারণ নামকরণের অভ্যাসের দিকে ইঙ্গিত করেছেন, আপনি কেন এটি ব্যবহার করতে পারছেন না তার কোনও কারণ আমি দেখতে পাচ্ছি না। অবশ্যই এর অর্থ এই নয় যে কেউ ভেরিয়েবলের মানটি আর লিখবেন না। :)


11
যেমনটি সবাই জানেন, আইই যদি এটি প্রয়োগ না করে তবে এটির অস্তিত্বও থাকতে পারে।
জোশ হিনম্যান

3
দুর্ভাগ্যক্রমে, এবং ব্যবহারিকভাবে বলতে - এটি সত্য। আইই মার্কেটের বিশাল শেয়ারের মালিক does যদি আমার কোনও ব্যবসায়ের মালিকানা থাকে এবং ওয়েব অ্যাপ্লিকেশনগুলি অভ্যন্তরীণভাবে ব্যবহৃত হয়, তবে আমি এফএফকে মানীকৃত করব। আমি জানি না কেন এত লোক আই.ই. সম্পর্কে চিন্তা করে, এটি ফুটে ওঠে।
জেসন বুটিং

@ রিচ: আমার মতামতটি সত্য বলেছিল কে? আপনি বেশ ধারনা করেছেন। তবুও, যতদূর আমি উদ্বিগ্ন, আই আই চুষে ফেলা একটি সত্য। আপনার নিজস্ব তথ্য থাকতে পারে, আমি আপনাকে বলিনি যে আমার বিশ্বাস করতে হবে। : পি একটি জ্যানাক্স বা কিছু নিন ...
জেসন বুটিং

@ রিচ বি, হ্যাঁ এটি কেবল বোবা মন্তব্য করার ছিল এবং আমার উপর বিশ্বাস রাখবে, আমি জানতে পারি, আমি প্রচুর বোবা মন্তব্য করি। @ জেসন বি - আকর্ষণীয়, আমি এই রাতে খুব সমস্যা পেয়েছিলাম .. কনস্ট এফ এফ এ কাজ করেছেন তবে আইই নয়। স্পষ্টতার জন্য ধন্যবাদ

আই আই কে কে পাত্তা দেয়? আমি না! এফএফ বা ক্রোম বা অপেরা ইত্যাদি ... প্রায় প্রতিটি ওএস প্ল্যাটফর্মে ইনস্টল করা যায়। এছাড়াও কম্পিউটার খুচরা বিক্রেতারা সাধারণত পুরানো আইই সংস্করণটি চুষে নিতে জানেন তাই তারা প্রায়শই (বা এমনকি প্রতিটি সময়) কম্পিউটার বিক্রি করার আগে বিকল্প ব্রাউজারগুলি ইনস্টল করে। সুতরাং আমি সিদ্ধান্ত নিয়েছি যে আমার বিকাশযুক্ত অ্যাপ্লিকেশনটি বেমানান ব্রাউজারগুলি সম্পর্কে মোটেই যত্ন না নেবে: যদি ব্রাউজার বিকাশকারীরা তাদের পণ্যগুলি আমার অ্যাপ্লিকেশনটি ব্যবহার করতে পারে এমন মানগুলিকে সম্মান করার বিষয়ে যত্নশীল হয়, যদি না হয় তবে ব্যবহারকারীরা একটি ভিন্ন ব্রাউজার ব্যবহার করবে ... আমি এর সাথে বেঁচে থাকতে পারি; -) তবে মাইক্রোসফ্ট কি বাজারের অংশটি হারাতে পারে? না তারা তাই করতে পারে না "তারা" তাদের দেব রাজনীতি বদলে দেবে!
উইলি উইনকা

20

জাভাস্ক্রিপ্টে, আমার পছন্দটি ধ্রুবক মানগুলি ফিরিয়ে আনার জন্য ফাংশনগুলি ব্যবহার করা।

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


alert(MY_CONSTANT());

6
এটি বোঝা যাচ্ছে যে এটি @ বার্কস জবাব (@ ট্রিনিথিস মন্তব্য) তে উল্লিখিত একই সমস্যার মধ্যে পড়ে। `MY_CONSTANT = ফাংশন () {" কিছু-অন্য-মান "ফিরিয়ে দেয়; it এটি ভেঙে দেয়। +1 যদিও, শালীন এবং দ্রুত সমাধান।
প্যাট্রিক এম

13
-1। ভের SOME_NAME = মান (এটি এখনও রূপান্তরযোগ্য) এর চেয়ে বেশি কোনও লাভ নেই, এটি আরও কোড এবং এর ব্যাখ্যা প্রয়োজন।
মাইকমেকানা

@ পেট্রিকএম এটি সত্য যে আপনি যেমন সিউডো-কনস্ট্যান্টগুলি সংশোধন করতে পারবেন, যেমন অন্যান্য ভাষায় যেমন সি সি, যার উপর আপনি ধ্রুবকগুলিকে সংশোধন করতে সক্ষম হবেন না , আপনি এখনও উদাহরণস্বরূপ এটি করতে পারেন। সুতরাং যতক্ষণ আপনি কিছু পদ্ধতির ব্যবহার করেন যা কমপক্ষে এটি স্থির রাখার পরামর্শ দেয় এটি দুর্দান্ত ইমো।
রেভ

20

মজিলাস MDN ওয়েব ডক্স সম্পর্কে ভাল উদাহরণ এবং ব্যাখ্যা রয়েছে 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। এবং এটি অযৌক্তিক কারণ :

সুতরাং, আই 9 কি কনস্টের সাথে করছে? এখনও অবধি, আমাদের সিদ্ধান্ত এটি সমর্থন না করার সিদ্ধান্ত নিয়েছে। এটি এখনও সর্বসম্মত বৈশিষ্ট্য নয় কারণ এটি সমস্ত ব্রাউজারে কখনই উপলভ্য ছিল না।

...

শেষ পর্যন্ত, দেখে মনে হচ্ছে ওয়েবে সবচেয়ে ভাল দীর্ঘমেয়াদী সমাধান হ'ল এটিকে ছেড়ে দেওয়া এবং মানককরণের প্রক্রিয়াগুলি তাদের কোর্সটি চালানোর জন্য অপেক্ষা করা।

তারা এটি প্রয়োগ করে না কারণ অন্য ব্রাউজারগুলি এটি কার্যকরভাবে প্রয়োগ করে না ?! এটিকে আরও ভাল করে তৈরি করতে খুব ভয় হচ্ছে? স্ট্যান্ডার্ড সংজ্ঞা বা না, একটি ধ্রুবক একটি ধ্রুবক: একবার সেট করুন, কখনও পরিবর্তন হয়নি।

এবং সমস্ত ধারণার কাছে: প্রতিটি ফাংশন ওভাররাইট করা যেতে পারে (এক্সএসএস ইত্যাদি)। সুতরাং varবা কোন পার্থক্য নেই function(){return}constএকমাত্র আসল ধ্রুবক।

আপডেট: আইই 11 সমর্থন করে const :

IE11 যাক, সহ উঠতি নাম ECMAScript 6 মান ভাল সংজ্ঞায়িত এবং সাধারণভাবে ব্যবহৃত বৈশিষ্ট্যগুলির জন্য সমর্থন const, Map, Set, এবং WeakMap, সেইসাথে __proto__জন্য উন্নত ইনটেরোপিরাবিলিটি।


24
"এটি কখনই সমস্ত ব্রাউজারে উপলব্ধ ছিল না"। আপনি যদি এটি আইইতে উপলব্ধ না করেন তবে তা সব ব্রাউজারে কখনই থাকবে না।
কিমি 1

ড্রাইভিং স্ট্যান্ডার্ডাইজেশন প্রত্যেকের জন্য নয়;) - সংস্থাগুলি আসে এবং তারা আবার যায় - কাঠের
প্রতিক্রিয়াগুলি

আরও একটি বিষয়: ভিবিএ এখনও সমস্ত ব্রাউজারগুলিতে কনসেসস বৈশিষ্ট্য নয় এবং এমএস ভিবিএতে কনস্টকে সমর্থন করে - এটি চ্যানেলিং ডেভেলপমেন্ট বাজেটগুলির আয়ত্ত;)
দ্রুত

17

আপনি যদি ফাংশনগুলি ব্যবহার করে কিছু মনে করেন না:

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

এই পদ্ধতির আপনাকে নিয়মিত ভেরিয়েবলের পরিবর্তে ফাংশন দেয় তবে এটি গ্যারান্টি দেয় * এটি সেট হয়ে যাওয়ার পরে কেউ মান পরিবর্তন করতে পারে না।

a = constant(10);

a(); // 10

b = constant(20);

b(); // 20

আমি ব্যক্তিগতভাবে এটি বরং আনন্দদায়ক মনে করি, বিশেষ করে নকআউট পর্যবেক্ষণগুলি থেকে এই প্যাটার্নটি অভ্যস্ত করার পরে।

* যদি না কেউ constantআপনাকে ফাংশন বলার আগে সেটির নতুন সংজ্ঞা দেয়


1
আন্ডারস্কোর.জেএস এই কোডের মতো একটি ধ্রুবক ফাংশন প্রয়োগ করে।
এপ্রিজটেজ

সাধারণ, সংক্ষিপ্ত এবং ওপির প্রশ্নের চেতনার উত্তর দেয়। এটি আরও upVotes পাওয়া উচিত ছিল।
ম্যাক

3
এটি সত্যই আমার পক্ষে কাজ করেনি। যদিও বন্ধ হওয়াটি একে অপরিবর্তনীয় করে তোলে, আপনি যে ভারটিকে এটি নিয়োগ করেছেন তা এখনও ওভাররাইট করা যেতে পারে। উদাহরণস্বরূপ: 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"
});

কটাক্ষপাত করা এই আরো সুনির্দিষ্ট জন্য মোজিলা MDN উপর। এটি কোনও প্রথম স্তরের পরিবর্তনশীল নয়, কারণ এটি কোনও বস্তুর সাথে সংযুক্ত, তবে আপনার যদি কিছু সুযোগ থাকে তবে আপনি এটিকে এটি সংযুক্ত করতে পারেন। thisপাশাপাশি কাজ করা উচিত। সুতরাং উদাহরণস্বরূপ, বৈশ্বিক পরিসরে এটি করার ফলে উইন্ডোতে সিউডো ধ্রুবক মান ঘোষণা করা হবে (যা সত্যিই খারাপ ধারণা, আপনি বিশ্বব্যাপী যুদ্ধগুলি অযত্নে ঘোষণা করবেন না)

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

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

দ্রষ্টব্য: অ্যাসাইনমেন্ট আপনাকে কনসোলে নির্ধারিত মানটি ফিরিয়ে দেবে, তবে ভেরিয়েবলের মান পরিবর্তন হবে না


সাফারিতে কাজ করছেন না, এবং মজিলায় আপনি যদি বিবৃতিটি আবার নির্ধারণ করেন - আলাদা মান সহ - এটি মানটিকে পুনরায় স্বাক্ষর করবে।
অক্ষয়

2
'সাফারিতে কাজ করছেন না', সাফারিতে সমর্থিত নয় । একই নয়. এবং যদি এটি চেষ্টা করে তবে এটি একটি 'আনকাচড টাইপ এয়ারার: ​​সম্পত্তি পুনরায় সংজ্ঞায়িত করতে পারে না: <সম্পত্তি নাম এখানে>' ফেলে দেওয়া উচিত। হয় আপনি এটি ভুল করছেন, বা আপনার এফএফ এটি ভুলভাবে প্রয়োগ করেছে। আমার ধারণা এটি উভয়ের মিশ্রণ।
দশশো

14

কাঠামোগত যেখানে সম্ভব সেখানে গ্রুপ ধ্রুবক:

উদাহরণস্বরূপ, আমার বর্তমান গেম প্রকল্পে আমি নীচে ব্যবহার করেছি:

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

অ্যাসাইনমেন্ট:

var wildType = CONST_WILD_TYPES.REGULAR;

Comparision:

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;
}

আইই 11 নতুন ইএস 6 স্ট্যান্ডার্ডের সাথে রয়েছে যার 'কনস্ট' ঘোষণা রয়েছে।
উপরে 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

আইই ভুলে যান এবং constকীওয়ার্ডটি ব্যবহার করুন ।


9
আমার জন্য কাজ কর! তবে আমি একটি ক্রোম এক্সটেনশন লিখছি, তাই আমি জানি যে আমি একটি বুদ্ধিমান ব্রাউজারে আছি ...
yoyo

1
এক্সটেনশন এবং অ্যাডোন লেখার বিষয়ে @ ইয়য়ো সেরা ভূমিকা - কোনও ক্রস-ব্রাউজার সমর্থন!
ইয়ান

1
@ আইয়ান 2019-এ স্বাগতম, ক্রস-ব্রাউজারের অসঙ্গতি প্রায় অদৃশ্য হয়ে গেছে :)
ফ্যাসেল্ডেব

9

তবুও এটি করার কোনও সঠিক ক্রস ব্রাউজারের পূর্বনির্ধারিত উপায় নেই, আপনি অন্যান্য উত্তরের হিসাবে দেখানো হিসাবে ভেরিয়েবলের পরিধি নিয়ন্ত্রণ করে এটি অর্জন করতে পারেন।

তবে আমি অন্যান্য ভেরিয়েবল থেকে পৃথক করতে নাম স্থান ব্যবহার করার পরামর্শ দেব। এটি অন্যান্য ভেরিয়েবল থেকে কমপক্ষে সংঘর্ষের সম্ভাবনা হ্রাস করবে।

যথাযথ নেমস্পেসিং

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

সুতরাং এটি ব্যবহার করার সময় iw_constant.nameবা হবেiw_constant.age

আপনি অবজেক্ট.ফ্রিজে পদ্ধতিটি ব্যবহার করে যে কোনও নতুন কী যুক্ত করা বা আইও_কনস্ট্যান্টের ভিতরে কোনও কী পরিবর্তন করতে বাধা দিতে পারেন। তবে এটি লিগ্যাসি ব্রাউজারে সমর্থিত নয়।

উদা:

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')


** উভয় উদাহরণে আপনাকে নাম ব্যবধানের বিষয়ে খুব সতর্কতা অবলম্বন করতে হবে যাতে আপনার বস্তু বা ক্রিয়াকলাপটি অন্য গ্রন্থাগারের মাধ্যমে প্রতিস্থাপন করা না যায়।


7

কিছুক্ষণের জন্য, আমি অবজেক্টের লিটারেলগুলিতে "ধ্রুবকগুলি" (যা এখনও বাস্তবে ধ্রুবক ছিল না) নির্দিষ্ট করেছিলাম with()। আমি ভেবেছিলাম এটা এত চালাক। এখানে একটি উদাহরণ:

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

অতীতে, আমি একটি CONSTনেমস্পেসও তৈরি করেছি যেখানে আমি আমার সমস্ত ধ্রুবক রাখি। আবার ওভারহেড দিয়ে। Sheesh।

এখন, আমি শুধু না var MY_CONST = 'whatever';করতে চুম্বন


16
যদি thanমানের চেয়ে আরও খারাপ কিছু থাকে তবে তা অবশ্যই with
নিকিসি

4
ইওল খুব খারাপ! আমার বাড়িটা একবার জ্বলে উঠল!
ডাব্লু

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

আমারও এ নিয়ে সমস্যা হয়েছে। এবং উত্তরটি অনুসন্ধান করার পরে এবং প্রত্যেকের সমস্ত প্রতিক্রিয়াগুলি অনুসন্ধান করার পরে, আমি মনে করি আমি এটির একটি কার্যকর সমাধান নিয়ে এসেছি।

দেখে মনে হচ্ছে যে বেশিরভাগ উত্তর আমি এসেছি তা ধ্রুবকগুলি ধরে রাখতে ফাংশন ব্যবহার করে using অনেকগুলি ফোরামের ব্যবহারকারীরা পোস্ট হিসাবে পোস্ট করেন, ক্লায়েন্ট পক্ষের ব্যবহারকারীরা সহজেই লিখে ফেলতে পারেন written আমি কীথ আওল্টসের জবাব দেখে আগ্রহী হয়েছিলাম যে ধ্রুবক বস্তুগুলি বাইরের দ্বারা অ্যাক্সেস করা যায় না, তবে কেবল কেবল অভ্যন্তরের ক্রিয়াগুলি থেকে।

সুতরাং আমি এই সমাধানটি নিয়ে এসেছি:

বেনামে ফাংশনটির ভিতরে সবকিছু রাখুন যাতে সেইভাবে, ভেরিয়েবল, অবজেক্টস ইত্যাদি ক্লায়েন্টের পক্ষ থেকে পরিবর্তন করা যায় না। অন্যান্য ফাংশনগুলি ভিতরে থেকে 'আসল' ফাংশনগুলি কল করে 'বাস্তব' ফাংশনগুলিও আড়াল করুন। আমি ক্লায়েন্ট পক্ষের কোনও ব্যবহারকারীর দ্বারা কোনও ফাংশন পরিবর্তন করা হয়েছে কিনা তা যাচাই করতে ফাংশনগুলি ব্যবহার করার কথাও ভেবেছিলাম। যদি ফাংশনগুলি পরিবর্তন করা হয়ে থাকে, তবে অভ্যন্তরের 'সুরক্ষিত' এবং পরিবর্তন করা যায় না এমন ভেরিয়েবলগুলি ব্যবহার করে তাদের আবার পরিবর্তন করুন।

/*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. উপরের স্ক্রিপ্টের সমস্ত কোড অনুলিপি করুন এবং এটি জাভাস্ক্রিপ্টকম্প্রেসর ডটকম পৃষ্ঠায় শীর্ষ টেক্সারিয়ায় পেস্ট করুন।
  2. বেস 62 এনকোড চেকবাক্সটি চেক করুন, সঙ্কুচিত চলকগুলির চেকবক্সটি চেক করুন।
  3. কম্প্রেস বোতাম টিপুন।
  4. এটি সমস্ত একটি .js ফাইলে আটকান এবং সংরক্ষণ করুন এবং এটি আপনার পৃষ্ঠার শিরোনামে আপনার পৃষ্ঠায় যুক্ত করুন।

এটি একটি ভাল সমাধান যা অন্তর্ভুক্ত করার জন্য একটি লাইব্রেরি হিসাবে সুন্দরভাবে গুটিয়ে রাখা যেতে পারে। তবে আমি এই কোডটিতে আপনার ভেরিয়েবলের নামকরণ অপছন্দ করি। কেনিথের কোড হিসাবে ব্যবহৃত "নাম" এবং "মান" এর মতো বর্ণনামূলক নামগুলি কেন ফেলে দিন? গৌণ সমস্যা, কিন্তু এখনও।
কর্ডল

5

স্পষ্টতই এটি একটি মানকৃত ক্রস ব্রাউজার কনস্ট কীওয়ার্ডের প্রয়োজনীয়তা দেখায়।

কিন্তু এখনকার জন্য:

var myconst = value;

অথবা

Object['myconst'] = value;

উভয়ই যথেষ্ট বলে মনে হচ্ছে এবং অন্য কোনও কিছুর মতো বাজুকা দিয়ে একটি ফ্লাই শ্যুটিংয়ের মতো।


ভাল পুরাতন var myconst = মান গ্রহণ; এবং ডিবাগিংয়ের জন্য অতিরিক্ত ডিবাগিং কোড ব্যবহার করুন ... - যতক্ষণ না সমস্ত ব্রাউজার কনস্টকে সমর্থন করে না ততক্ষণ পাগলের মতো কাজ করে
দ্রুত

4

আমি আমার গ্রিসমোনকি স্ক্রিপ্টগুলির 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"- তবে কোনও আইডিই আপনাকে প্রাথমিকভাবে এটি জানাতে পারে যা সংজ্ঞাযুক্ত Date.Hoursনয়।
লে_ম

4

ঠিক আছে, এটি কুৎসিত, তবে এটি আমাকে ফায়ারফক্স এবং ক্রোমিয়ামে একটি ধ্রুবক দেয়, সাফারি এবং অপেরাতে একটি ইনসন্ট্যান্ট্যান্ট ধ্রুবক (ডাব্লুটিএফ?) এবং আইআই তে একটি পরিবর্তনশীল দেয়।

অবশ্যই eval () খারাপ, কিন্তু এটি ছাড়া আইই একটি ত্রুটি নিক্ষেপ করে স্ক্রিপ্টগুলি চালানো থেকে রোধ করে।

সাফারি এবং অপেরা কনস্ট্যান্ট কীওয়ার্ডকে সমর্থন করে তবে কনস্টের মানটি পরিবর্তন করতে পারেন

এই উদাহরণে, সার্ভার-সাইড কোডটি পৃষ্ঠাতে জাভাস্ক্রিপ্ট লিখছে, একটি মান দিয়ে {0 la প্রতিস্থাপন করবে।

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');

... এবং আপনি ভিবিএতে কনস্ট ব্যবহার করতে পারেন ... xbrowser? ... আপস ...;)
দ্রুত

ওপি জাভাস্ক্রিপ্ট সম্পর্কে জিজ্ঞাসা করেছে, নির্দিষ্ট ভারী মতামতযুক্ত জেএস কাঠামোর সাথে উত্তর দেয়। ব্যবহারিকভাবে অফ-টপিক।
উঠুন

2
@rounce: বন্ধ-প্রসঙ্গহীন উত্তর এখনও উত্তরের হচ্ছো, তাই না পতাকা তাদের না একটি উত্তর কিন্তু downvote এবং ভোট মুছতে পরিবর্তে। দেখুন কীভাবে আমি "উত্তর নয়" পতাকাটি সঠিকভাবে ব্যবহার করব?
কেভিন গুয়ান

@ কেভিনগুয়ান লক্ষিত, ভবিষ্যতে করবে।
রোজ

4

বার্কের উত্তরের একটি উন্নত সংস্করণ যা আপনাকে এর CONFIG.MY_CONSTপরিবর্তে করতে দেয় CONFIG.get('MY_CONST')

এটির জন্য আই 9 + বা একটি সত্যিকারের ওয়েব ব্রাউজার প্রয়োজন।

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

জাভাস্ক্রিপ্ট ES6 (পুনরায়) মূল 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যাইহোক যাইহোক সমস্ত ঘোষণার জন্য অনুসরণ করা একটি ভাল কনভেনশন , সুতরাং কেবল এটির উপর নির্ভর করুন।


আইই 11 থেকে কেবল :-(
মো।

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

'কনস্ট' শব্দটি আগে প্রস্তাব করা হয়েছিল এবং এখন এটি আনুষ্ঠানিকভাবে ES6 এ অন্তর্ভুক্ত করা হয়েছে। কনস্ট কীওয়ার্ডটি ব্যবহার করে, আপনি একটি মান / স্ট্রিং পাস করতে পারেন যা একটি পরিবর্তনযোগ্য স্ট্রিং হিসাবে কাজ করবে।


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উপরে উল্লিখিত ছিল ছাড়াও বাস্তবায়ন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.