কীওয়ার্ড 'কনস্ট' মানটিকে পরিবর্তনযোগ্য করে তোলে না। এর মানে কী?


85

আছে const সংজ্ঞা মধ্যে ES6 এক্সপ্লোরিং ডঃ অ্যাক্সেল Rauschmayer দ্বারা:

constলেটের মতো কাজ করে তবে আপনি যে ভেরিয়েবলটি ঘোষণা করেছেন তা অবিলম্বে আরম্ভ করা উচিত, এমন একটি মান সহ যা পরে পরিবর্তন করা যায় না । […]

const bar = 123;
bar = 456;  // TypeError: `bar` is read-only

এবং তারপরে তিনি লেখেন

ক্ষতি: কনস্ট মানটি পরিবর্তনযোগ্য করে তোলে না

const কেবলমাত্র এর অর্থ হ'ল একটি ভেরিয়েবলের সর্বদা একই মান থাকে তবে এর অর্থ এই নয় যে মানটি নিজেই হয় বা স্থাবর হয়।

আমি এই ক্ষতির সাথে কিছুটা বিভ্রান্ত হয়ে পড়েছি। constএই বিপত্তিটি কি কেউ পরিষ্কারভাবে সংজ্ঞা দিতে পারে ?


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

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

4
const x = "immutable"অপরিবর্তনীয়, কারণ Stringপরিবর্তনযোগ্য। constনিছক পুনরায় নিয়োগ নিষিদ্ধ করে।

4
@ বিবিহিমাহ্মাহিরির: একটি রেফারেন্স (জাভাস্ক্রিপ্ট বস্তুর জন্য কী করে) পাস করা রেফারেন্স দ্বারা পাসের মত নয় (যা বাইন্ডিংয়ের মধ্যে সম্পর্কের বর্ণনা দেয়, মানটি অপ্রাসঙ্গিক)।
ফেলিক্স ক্লিং

4
@ বিবিহিমাহ্মাহিরির: হ্যাঁ, এটিই সমস্যা। মেয়াদ পাস-বাই-রেফারেন্স একটি খুব নির্দিষ্ট অর্থ
ফেলিক্স ক্লিং

উত্তর:


97

এমডিএন সুন্দরভাবে এটির যোগফল দেয়:

কনস্টের ঘোষণাটি একটি মানকে কেবল পঠনযোগ্য রেফারেন্স তৈরি করে। এর অর্থ এই নয় যে এটির মানটি অপরিবর্তনীয়, কেবলমাত্র ভেরিয়েবল আইডেন্টিফায়ারকে পুনরায় নিয়োগ দেওয়া যায় না। উদাহরণস্বরূপ, বিষয়বস্তু যদি কোনও অবজেক্ট হয় তবে এর অর্থ এটি অবজেক্টটি নিজেই পরিবর্তিত হতে পারে।

আরও সংক্ষিপ্তভাবে: কনট একটি অপরিবর্তনীয় বাঁধাই তৈরি করে।

অন্য কথায়: কন, কন, যেমন ভেরিও আপনাকে মেমরির একটি পরিবর্তনীয় অংশ দেয় যাতে আপনি কোনও কিছু সঞ্চয় করছেন। যাইহোক, কনস্ট নির্দেশ দেয় যে আপনাকে অবশ্যই মেমরির একই অংশটি উল্লেখ করতে হবে - আপনি ভেরিয়েবলটিকে মেমরির বিভিন্ন অংশে পুনরায় সাইন করতে পারবেন না, কারণ ভেরিয়েবল রেফারেন্স স্থির থাকে।

কিছু ঘোষণার পরে সত্যিকারের ধ্রুবক এবং অপরিবর্তনীয় কিছু করার জন্য, আপনাকে এর মতো কিছু ব্যবহার করতে হবে Object.freeze()। তবে, এটি অগভীর এবং কেবল কী / মান জোড়গুলিতে কাজ করে। সম্পূর্ণ অবজেক্টকে হিমায়িত করতে কিছুটা বেশি প্রচেষ্টা লাগে। পারফরম্যান্ট উপায়ে বারবার এটি করা আরও চ্যালেঞ্জের। আপনার যদি সত্যিই এর প্রয়োজন হয় তবে আমি Immutable.js এর মতো কিছু পরীক্ষা করার পরামর্শ দেব


20
সি পদে: যদি একটি সাধারণ var xহয় struct Object *x, একটি const xহয় struct Object *const x। পয়েন্টারটি পরিবর্তন করা যায় না; জিনিসটি এটি করতে পারে।
ফান্ড মনিকার লকসুইট

151

আপনি যখন constজাভাস্ক্রিপ্টে কিছু করেন, আপনি অন্য কিছু উল্লেখ করার জন্য ভেরিয়েবলটি পুনরায় সাইন করতে পারবেন না। যাইহোক, ভেরিয়েবল এখনও একটি পরিবর্তনীয় বস্তুর রেফারেন্স করতে পারে।

const x = {a: 123};

// This is not allowed.  This would reassign `x` itself to refer to a
// different object.
x = {b: 456};

// This, however, is allowed.  This would mutate the object `x` refers to,
// but `x` itself hasn't been reassigned to refer to something else.
x.a = 456;

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


18
এই উত্তর গৃহীত উত্তর চেয়ে অনেক ভাল। আরও সংক্ষিপ্ত এবং প্রকৃত উদাহরণ কোড ধারণ করে। (অন্য কথায়, বিন্দুতে পৌঁছে যায় )) +1
jpmc26

16

রিবন্ডিং

constএবং letঘোষণাগুলি শনাক্তকারী এবং মানগুলির মধ্যে পুনর্নির্বাচনগুলি (ওরফে পুনরায় নিয়োগ) অনুমোদিত কিনা তা নিয়ন্ত্রণ করে:

const x = "initial value";
let y = "initial value";

// rebinding/reassignment

try { x = "reassignment" } catch(e) { console.log(x) } // fails

y = "reassignment"; // succeeds
console.log(y);

অপরিচ্ছন্নতা

অপরিচ্ছন্নতা টাইপ স্তরে নিয়ন্ত্রিত হয়। Objectএকটি পরিবর্তনীয় প্রকার, যেখানে একটি পরিবর্তনযোগ্য Stringপ্রকার:

const o = {mutable: true};
const x = "immutable";

// mutations

o.foo = true; // succeeds
x[0] = "I"; // fails

console.log(o); // {mutable: true, foo: true}
console.log(x); // immutable


1

কনস্টের অর্থ: আপনি প্রাথমিকভাবে নির্ধারিত মান পরিবর্তন করতে পারবেন না।

প্রথমে নির্ধারণ করুন, জেএস-এ একটি মান কী is মানটি হতে পারে: বুলিয়ানস, স্ট্রিংস, সংখ্যা, অবজেক্টস, ফাংশন এবং অপরিবর্তিত মান।

পছন্দ: লোকেরা আপনাকে আপনার নামে ডাকে, এটি পরিবর্তন হয় না। তবে, আপনি আপনার পোশাক পরিবর্তন করুন। বাঁধাই মানুষের মধ্যে এবং আপনি আপনার নাম। বাকীটা বদলে যেতে পারে। অদ্ভুত উদাহরণের জন্য দুঃখিত।

সুতরাং, আমি আপনাকে কয়েকটি উদাহরণ দেই:

// boolean
const isItOn = true;
isItOn = false;           // error

// number
const counter = 0;
counter++;                // error

// string
const name = 'edison';
name = 'tesla';           // error

// objects
const fullname = {
  name: 'albert',
  lastname: 'einstein'
};

fullname = {              // error
  name: 'werner',
  lastname: 'heisenberg'
};
// NOW LOOK AT THIS:
//
// works because, you didn't change the "value" of fullname
// you changed the value inside of it!
fullname.name = 'hermann';

const increase = aNumber => ++aNumber;
increase = aNumber => aNumber + 1;      // error

// NOW LOOK AT THIS:
//
// no error because now you're not changing the value
// which is the decrease function itself. function is a
// value too.
let anotherNumber = 3;
const decrease = () => --anotherNumber;

anotherNumber = 10;             // no error
decrease();                     // outputs 9

const chaos = undefined;
chaos = 'let there be light'    // error

const weird = NaN;
weird = 0                       // error

আপনি দেখতে পাচ্ছেন, যদি না আপনি "প্রথম" নির্ধারিত মান কনস্টে পরিবর্তন না করেন , ত্রুটি নেই। আপনি যখনই প্রথম নির্ধারিত মানটিকে অন্য কোনওটিতে পরিবর্তন করার চেষ্টা করেন তখন তা রাগান্বিত হয় এবং এটি একটি ত্রুটি দেয়।

সুতরাং, এটি ব্যবহারের সময় আপনি হয়ত জানতে পারেন এটি দ্বিতীয় const। যা হ'ল এটির ঘোষণার কোনও মান হিসাবে এটি সূচনা করা উচিত বা এটি ক্ষুব্ধ হবে।

const orphan;                    // error
const rich = 0;                  // no error

0

ES6/ ES2015 constকীওয়ার্ড:

constশব্দ (সঙ্গে ঘোষণা মত একটি ব্লক বিশ্লেষণ করা ভেরিয়েবল ডিক্লেয়ার করতে ব্যবহৃত হয় let)। এর সাথে ভেরিয়েবল ঘোষণার মধ্যে পার্থক্য constএবং letনিম্নলিখিতটি:

  1. ঘোষিত একটি পরিবর্তনশীল পুনরায় নিয়োগ দেওয়াconst যাবে না ।
  2. একটি পরিবর্তনশীল ঘোষিত constকরা হয়েছে বরাদ্দ যখন ঘোষিত । এটি পূর্ববর্তী পয়েন্টটির যৌক্তিক পরিণতি কারণ এর সাথে ঘোষিত একটি চলকটি constপুনরায় স্বাক্ষর করা যায় না, এজন্য আমরা যখন ভেরিয়েবল ঘোষণা করি ঠিক তখনই আমাদের এটি নির্ধারণ করতে হবে

উদাহরণ:

// we declare variable myVariable
let myVariable;

// first assignment
myVariable = 'First assingment';
// additional assignment
myVariable = 'Second assignment';

// we have to declare AND initialize the variable at the same time
const myConstant = 3.14;

// This will throw an error
myConstant = 12;

উপরের উদাহরণে আমরা নিম্নলিখিতগুলি পর্যবেক্ষণ করতে পারি:

  1. ভেরিয়েবলের সাথে myVariableঘোষিত letপ্রথমে ঘোষণা করা যাবে এবং তারপরে নির্ধারিত হবে।
  2. myConstantসাথে ঘোষিত ভেরিয়েবলটি constএকই সাথে ঘোষণা করতে হবে এবং নির্ধারিত করতে হবে।
  3. যখন আমরা ভেরিয়েবলটি পুনরায় নিয়োগের চেষ্টা করি myConstantআমরা নিম্নলিখিত ত্রুটিটি পাই:

আনকড টাইপ এরির: ধ্রুবক পরিবর্তনশীলকে বরাদ্দ

কেভেট: নির্ধারিত ভেরিয়েবলটি constএখনও পরিবর্তনযোগ্য:

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

  1. কোনও বস্তুর সম্পত্তি যুক্ত / মুছতে / পরিবর্তন করা tering
  2. নির্দিষ্ট অ্যারে সূচকে একটি অ্যারের মান পরিবর্তন করা

যদি সত্যিই কোনও বস্তু পরিবর্তনযোগ্য না হয় তবে আপনাকে এরকম কিছু ব্যবহার করতে হবে Object.freeze()। এটি এমন একটি পদ্ধতি যা কোনও বস্তুকে হিম করে দেয়। হিমায়িত অবজেক্টটি আর পরিবর্তন করা যাবে না এবং কোনও নতুন বৈশিষ্ট্য যুক্ত করা যাবে না।

উদাহরণ:

const obj = {prop1: 1};

obj.prop1 = 2;
obj.prop2 = 2;

console.log(obj);

// We freeze the object here
Object.freeze(obj);

obj.prop1 = 5;
delete obj.prop2;

// The object was frozen and thus not mutated
console.log(obj);

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