কেন আমি জাভাস্ক্রিপ্টে একটি ধ্রুবকের মান পরিবর্তন করতে পারি


103

আমি জানি যে ES6 এখনও মানসম্মত নয়, তবে বর্তমানে প্রচুর ব্রাউজারগুলি const জেএসে কীওয়ার্ড সমর্থন করে

বিশেষে, এটি লেখা আছে যে:

ধ্রুবকের মান পুনরায় নিয়োগের মাধ্যমে পরিবর্তিত হতে পারে না এবং একটি ধ্রুবকের পুনরায় ঘোষণা করা যায় না। এ কারণে, যদিও এটির সূচনা না করে ধ্রুবক ঘোষণা করা সম্ভব, এটি করা অযথা হবে।

এবং যখন আমি এই জাতীয় কিছু করি:

const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];

আমি দেখতে পাচ্ছি যে সবকিছু ঠিক আছে xxxএখনও আছে 6এবং yyyআছে []

তবে আমি যদি করি তবে yyy.push(6); yyy.push(1);আমার ধ্রুবক অ্যারে পরিবর্তন করা হয়েছে। এখনই এটি [6, 1]এবং উপায় দ্বারা আমি এখনও এটি দিয়ে পরিবর্তন করতে পারি না yyy = 1;

আমি এটি একটি বাগ, বা আমি কিছু মিস করছি? আমি এটি সর্বশেষতম ক্রোম এবং এফএফ 29 এ চেষ্টা করেছি


4
আপনি কি কেবল একটি শ্রেণি তৈরি করতে পারেন, ভেরিয়েবলটি ঘোষণা করতে পারেন এবং শ্রেণীর অভ্যন্তরে এর মান নির্ধারণ করতে পারেন। তারপরে, সেই ভেরিয়েবলের জন্য একটি গিটার তৈরি করুন; এবং একটি সেটারের প্রয়োগ করবেন না। এটি একটি ধ্রুবক বাস্তবায়ন করা উচিত ...
অ্যান্ড্রু

8
@ অ্যান্ড্রু ধন্যবাদ, তবে আমি কীভাবে এটি করতে পারি তা জিজ্ঞাসা করছি না। কনস্ট কীওয়ার্ডটি কেন এ জাতীয় আচরণ করে তা আমি আগ্রহী।
সালভাদোর ডালি

উত্তর:


176

নথিটিতে বলা হয়েছে:

... পুনরায় নিয়োগের মাধ্যমে ধ্রুবক পরিবর্তন করা যায় না
... ধ্রুবকটি পুনরায় ঘোষণা করা যায় না

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

সুতরাং এটি কাজ করে:

const x = {};

x.foo = 'bar';

console.log(x); // {foo : 'bar'}

x.foo = 'bar2';

console.log(x); // {foo : 'bar2'}  

এবং এই:

const y = [];

y.push('foo');

console.log(y); // ['foo']

y.unshift("foo2");

console.log(y); // ['foo2', 'foo']

y.pop();

console.log(y); // ['foo2']

তবে এর মধ্যে একটিও নয়:

const x = {};
x = {foo: 'bar'}; // error - re-assigning

const y = ['foo'];
const y = ['bar']; // error - re-declaring

const foo = 'bar'; 
foo = 'bar2';       // error - can not re-assign
var foo = 'bar3';   // error - already declared
function foo() {};  // error - already declared

4
সুতরাং আপনি বোঝাতে চেয়েছেন যে এটি কোনও বাগ নয়, তবে এটি কি এইভাবে কাজ করা উচিত? কারণ আমি ভেবেছিলাম ধ্রুবকের ধারণাটি এটি পরিবর্তন করা যায় না। মূলত একজন প্রোগ্রামার এর বিশ্বাস আছে যে যাই ঘটুক না কেন কিছুই আমার ধ্রুবকের মানকে পরিবর্তন করতে পারে না।
সালভাদোর ডালি

4
আমি মনে করি এটি এত সহজ নয়, এক্ষেত্রে ধ্রুবকের মান নির্দিষ্ট উপাদানগুলির একটি অ্যারে। যে কোনও কিছু পরিবর্তন করার অর্থ আপনি মান পরিবর্তন করেন ।
veritas

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

27
@ সালভাদোরডালি: ধ্রুবক এবং কেবল পঠনযোগ্য দুটি পৃথক জিনিস। আপনার পরিবর্তনশীল ধ্রুবক , তবে যে অ্যারেটি এটি নির্দেশ করছে কেবল পঠনযোগ্য
ম্যাট বার্ল্যান্ড

46

এটি ঘটে কারণ আপনার ধ্রুবক আসলে অ্যারেতে একটি রেফারেন্স সঞ্চয় করছে । আপনি যখন আপনার অ্যারেতে কিছু যুক্ত হন আপনি নিজের ধ্রুবক মানটি পরিবর্তন করছেন না, তবে অ্যারেটি এটি নির্দেশ করে। আপনি যদি কোনও ধ্রুবককে কোনও বস্তু বরাদ্দ করেন এবং এর কোনও সম্পত্তি পরিবর্তন করার চেষ্টা করেন তবে এটিই ঘটবে।

আপনি যদি কোনও অ্যারে বা অবজেক্টটি স্থিত করতে চান যাতে এটি পরিবর্তন করা যায় না, আপনি Object.freezeপদ্ধতিটি ইতিমধ্যে ECMAScript 5 এর অংশ হিসাবে ব্যবহার করতে পারেন ।

const x = Object.freeze(['a'])
x.push('b')
console.log(x) // ["a"]

4
যে একই যুক্তি দ্বারা, একটি ধ্রুবক fiveথেকে 5 সেট আসলে 5 মান নেই, এটা সংখ্যা 5. সুতরাং যদি আমি কি করতে শুধু একটা রেফারেন্স five++আমি ধ্রুবক পরিবর্তন করছি না, শুধু সংখ্যা এটি স্থানটিকে চিহ্নিত করে।
অ্যান্থনি


4
@ অ্যান্টনি আপনার উদাহরণে, আপনি যে পরিবর্তনশীলটি নির্দেশ করে সেই সংখ্যাটি পরিবর্তন করছেন five(ভেরিয়েবল five5 নম্বরের জন্য একটি লেবেল হিসাবে ব্যবহৃত হত, এখন এটি একটি পৃথক সংখ্যার দিকে নির্দেশ করছে: 6)। প্রশ্নের উদাহরণে (এবং এই উত্তর) xসর্বদা একই তালিকার দিকে নির্দেশ করে; xকনস্ট যদি আপনি এটি অন্য তালিকার দিকে নির্দেশ করতে পারেন না point পার্থক্য কেবল একই তালিকাটি বৃদ্ধি বা সঙ্কুচিত হতে পারে; এটি কেবল অ্যারে এবং অবজেক্টের পক্ষে সম্ভব কিছু নয় আদিমদের জন্য।
শ্রীভাতসারআর

9

আমি ভাবতে পারি এমন প্রতিটি প্রোগ্রামিং ভাষার সাথে এটি ধারাবাহিক আচরণ।

সি বিবেচনা করুন - অ্যারে কেবল প্রশংসিত পয়েন্টার। ধ্রুব অ্যারের অর্থ হ'ল পয়েন্টারের মান পরিবর্তন হবে না - তবে বাস্তবে সেই ঠিকানায় থাকা ডেটা নিখরচায়।

জাভাস্ক্রিপ্টে, আপনাকে ধ্রুবক অবজেক্টগুলির পদ্ধতিগুলি কল করার অনুমতি দেওয়া হয় (অবশ্যই - অন্যথায় ধ্রুবক বস্তুগুলি খুব বেশি কাজে দেয় না!) এই পদ্ধতিগুলির সাথে অবজেক্টটি সংশোধন করার পার্শ্ব প্রতিক্রিয়া থাকতে পারে। যেহেতু জাভাস্ক্রিপ্টে অ্যারেগুলি বস্তু, তাই এই আচরণটি তাদের জন্যও প্রযোজ্য।

আপনার যে সমস্ত বিষয়ে আশ্বাস দেওয়া হয়েছে তা হ'ল ধ্রুবক সর্বদা একই বস্তুর দিকে নির্দেশ করবে। অবজেক্টের বৈশিষ্ট্যগুলি নিজেই পরিবর্তন করতে পারে।


4

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

এছাড়াও, একটি গুরুত্বপূর্ণ নোট:

গ্লোবাল ধ্রুবকগুলি উইন্ডো বস্তুর বৈশিষ্ট্য হয়ে ওঠে না ...

https://developer.mozilla.org/en-US/docs/Web/JavaScript/ উল্লেখ / স্ট্যাটমেন্টস / কনস্ট্যান্ট


3

আমি মনে করি এটি আপনাকে এই সমস্যার আরও স্পষ্টতা দেবে: https://codeburst.io/explaining-value-vs-references-in-javascript-647a975e12a0

মূলত এটি constসর্বদা স্মৃতিতে একই ঠিকানার দিকে ইশারা করে down আপনি এই ঠিকানায় সঞ্চিত মান পরিবর্তন করতে পারেন তবে যে ঠিকানাটি constনির্দেশ করছে তা পরিবর্তন করতে পারবেন না ।

constআপনার উল্লেখ করা সংজ্ঞাটি সত্য হবে যখন constকোনও ঠিকানাটির দিকে ইঙ্গিত করা হবে যা একটি আদিম মান রাখে। এর কারণ constএটির ঠিকানা পরিবর্তন না করে আপনি এটিকে কোনও মান নির্ধারণ করতে পারবেন না (কারণ এটি আদিম মানগুলি নির্ধারণ করে কীভাবে) এবং এর ঠিকানা পরিবর্তন করার constঅনুমতি নেই।

যেখানে যেন constবিন্দুটি অ-আদিম মানের দিকে ইঙ্গিত করছে, ঠিকানার মানটি সম্পাদনা করা সম্ভব।


2

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

উদাহরণস্বরূপ, আমার অবজেক্টটি দেখে মনে হচ্ছে:

const number = {
    id:5,
    name:'Bob'
};

উপরের উত্তরগুলি সঠিকভাবে নির্দেশ করেছে যে এটি অবজেক্টটি যা কনস্ট্রিট এবং এটির বৈশিষ্ট্য নয়। সুতরাং, আমি আইডি বা নামটি আপডেট করে সক্ষম করব:

number.name = 'John';

তবে, আমি নিজের মতো করে অবজেক্টটি আপডেট করতে সক্ষম হব না:

number = {
    id:5,
    name:'John'
  };

TypeError: Assignment to constant variable.

4
আপনার উদাহরণটি একটি ব্যবহারিক এক এবং সঠিক বিবরণ
ইব্রাহিম

0

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

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