ES6 তে আমার 'লেট' বনাম 'কনস্ট' ব্যবহার করা উচিত?


214

আমি সম্প্রতি io.js এর জন্য প্রচুর ES6 কোড লিখছি। বুনো থেকে শিখার মতো খুব বেশি কোড নেই, তাই আমার মনে হয় আমি যেতে যেতে নিজের সম্মেলনগুলি সংজ্ঞায়িত করছি।

constবনাম কখন ব্যবহার করবেন সে সম্পর্কে আমার প্রশ্ন let

আমি এই নিয়মটি প্রয়োগ করছি: সম্ভব হলে ব্যবহার করুন const। কেবলমাত্র letযদি আপনি জানেন তবে এর মান পরিবর্তন করা দরকার use (আপনি সর্বদা ফিরে যেতে পারেন এবং একটিতে এটি পরিবর্তন constকরতে letপারেন যদি এটি পরে দেখা যায় যে এর মানটি পরিবর্তন করতে হবে))

এই নিয়মের মূল কারণ হ'ল ধারাবাহিকভাবে প্রয়োগ করা সহজ। ধূসর অঞ্চল নেই।

কথা হলো, যখন আমি বাস্তবে এই নিয়মের আবেদন আমার ঘোষণা 95% হয় const। এবং এটি আমার কাছে অদ্ভুত লাগছে। আমি শুধু ব্যবহার করছি letমতো জিনিসগুলির জন্য iএকটি forসঞ্চিত ফিবানচি মোট মতো জিনিসগুলির জন্য লুপ, অথবা মাঝে মাঝে (যা বাস্তব জীবনে অনেক আসা পর্যন্ত করে না)। আমি এতে অবাক হয়েছি - এটি থেকে আমার ইএস 5 কোডের 95% 'ভেরিয়েবলস' এর মানগুলি পরিবর্তিত হয় না। তবে constআমার সমস্ত কোড দেখে কোনওরকম ভুল অনুভূত হয়।

সুতরাং আমার প্রশ্ন: এটি কি constএত বেশি ব্যবহার করা ঠিক হবে ? আমার কি আসলে জিনিস করা উচিত const foo = function () {...};?

বা আমি কি constসেই ধরণের পরিস্থিতিগুলির জন্য সংরক্ষণ করব যেখানে আপনি মডিউলটির শীর্ষে অক্ষরে অক্ষরে অক্ষরে কোডিং করছেন - আপনি যেমন পুরো টুপিগুলিতে করছেন const MARGIN_WIDTH = 410;?


7
আমি সন্দেহ করি যে এই প্রশ্নটি প্রাথমিকভাবে মতামত ভিত্তিক এবং সম্ভবত এটি বন্ধ হয়ে যাওয়ার সম্ভাবনা রয়েছে তবে আমার 2 সেন্ট: এটি constবেশি ব্যবহার করা ঠিক আছে ।
ঝিমিনাল

15
function foo() {...}এর চেয়ে ভাল<anything> foo = function() {...}
অরেঞ্জডগ

12
@ ওরেঞ্জডগ আমি তার জন্য আপনার ব্যাখ্যাটি দেখতে চাই, যেহেতু আমি একেবারে বিপরীত সিদ্ধান্তটি শেষ করেছি। function foo() {...}উত্তোলনের কারণে এমন একটি সতর্কতা রয়েছে যা ডিবাগ করার সময় সামান্য বিভ্রান্তি সৃষ্টি করতে পারে। এছাড়াও, এর অস্তিত্বের অর্থ হ'ল আমাদের দুটি কনস্ট্রাক্ট রয়েছে যা একই কাজ করে তবে এর মধ্যে একটি কেবল একটি খুব নির্দিষ্ট প্রসঙ্গে কাজ করে। (আপনি যে কোনও জায়গাতেই কোনও ফাংশন এক্সপ্রেশন ব্যবহার করতে পারেন যেখানে কোনও অভিব্যক্তি উপস্থিত থাকতে পারে তবে আপনি কেবল বিবৃতি স্তরে কোনও ফাংশন ডিক্লেয়ারেশন ব্যবহার করতে পারেন)) আপনি যদি বংশবৃদ্ধির পক্ষে হন, সমস্যাটি কেবলমাত্র ফাংশন এক্সপ্রেশন সিনট্যাক্স পুরো শব্দটি ব্যবহার করে function
আগ্রহী 19

11
স্ট্যাক ট্রেসগুলিতে আননের পরিবর্তে ফাংশনের নাম রয়েছে। উত্তোলন করা ভাল এবং ফু এর অপরিজ্ঞাত হওয়ার বিষয়ে চিন্তা না করেই আপনাকে একটি প্রাকৃতিক ক্রমে ফাংশনগুলি সংজ্ঞায়িত করা যাক।
অরেঞ্জডগ

1
সেগুলি মনে রাখার জন্য ভাল পয়েন্ট, তবে আমি এখনও নিশ্চিত হতে পারি না। আধুনিক ডিবাগারগুলি আপনাকে কোন চিহ্নকে নির্ধারণ করেছে তার ভিত্তিতে আপনার ফাংশনের জন্য সঠিক প্রদর্শন নামটি বেছে নেওয়ার জন্য ভাল কাজ করে (যদি কোনও হয় - তবে যদি না হয় তবে আপনি একটি নামকৃত ফাংশন এক্সপ্রেশন ব্যবহার করতে পারেন)। ফাংশন ঘোষণার প্রাকৃতিক ক্রমটি অত্যন্ত বিষয়গত। এটি ভাবা যুক্তিসঙ্গত হতে পারে যে প্রাকৃতিক আদেশটি বেসিক টুকরাগুলি সংজ্ঞায়িত করে শুরু করা হয় এবং পরে সেগুলি ব্যবহার করা টুকরাগুলি সংজ্ঞায়িত করে।
আগ্রহী

উত্তর:


183

আমার উত্তর এখানে জাভাস্ক্রিপ্ট-নির্দিষ্ট নয়।

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

ফিরে যেতে এবং একটি কনটকে একটি লেটে পরিবর্তন করা সহজ মৃত। এবং ডিফল্টরূপে কনস্টেটে যাওয়া আপনাকে এমন করার আগে দুবার ভাবতে বাধ্য করে। এবং এটি অনেক ক্ষেত্রে একটি ভাল জিনিস।

কতগুলি বাগ আপনি দেখেছেন যে জড়িত পরিবর্তনগুলি অপ্রত্যাশিতভাবে পরিবর্তিত হচ্ছে? আমি অনেক অনুমান করব। আমি জানি যে আমি দেখতে পেলাম বেশিরভাগ বাগের মধ্যে অপ্রত্যাশিত রাষ্ট্রের পরিবর্তনগুলি জড়িত। আপনি উদারপন্থীভাবে কনস্ট ব্যবহার করে এই সমস্ত বাগ থেকে পরিত্রাণ পাবেন না, তবে আপনি সেগুলি থেকে অনেকটাই মুক্তি পাবেন!

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

এবং এটি সব কনস্টের সাথে চূড়ান্ত উদারপন্থী হওয়া দিয়ে শুরু হয়! ;) লেখার তুলনায় এটি লেখার জন্য আরও দুটি অক্ষর, সুতরাং এগিয়ে যান এবং constসমস্ত কিছু!


45
constএর চেয়ে আরও দুটি চরিত্র let...
অরেঞ্জডগ

72
তবে পাঁচটি অক্ষর অপরিবর্তনীয় চেয়ে কম।
সেরাদ

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

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

2
@ ক্রেড আপনার অর্থ কি "4 টি চরিত্র কম" বা আমি এখানে কিছু রসিকতা মিস করছি?
ম্যাথিয়াস বাইনেস

57

সাবধান হন, কারণ constঅবজেক্ট কীগুলি পরিবর্তনযোগ্য।

এখান থেকে: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / স্টেটমেন্টস / কনস্ট্যান্ট

অবজেক্ট কী সুরক্ষিত নয়

এই উদাহরণ বিবেচনা করুন:

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
সত্য, তবে প্রত্যাশিত আইএমও - যা ধ্রুবক তা হ'ল আপনার দেওয়া বিষয়টির রেফারেন্স constcolors = numbersপ্রত্যাশিত হিসাবে কাজ করবে না। আপনি যদি নিজের অবজেক্টের বৈশিষ্ট্যগুলি রক্ষা করতে চান তবে আপনি Object.freeze() বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স/…

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অগভীর।
ম্যাথিয়াস বাইনেস

@ ম্যাথিয়াসবাইনেন্স আমি এই মন্তব্যটি দেখতে পেয়েছি এবং আপনি এটির দ্বারা ঠিক কী বোঝাতে চেয়েছেন তা সম্পর্কে আমি আগ্রহী। আপনি দয়া করে বিস্তারিত বলতে পারেন?
কোল রবার্টস

@ কোলরোবার্টস অগভীর অপরিবর্তনীয়তার ধারণাটি যখন তখন অবজেক্টের রেফারেন্স নিজেই অপরিবর্তনীয় তবে বৈশিষ্ট্যগুলি এখনও পরিবর্তন করা যায়। কনস্ট কিওয়ার্ডটি কেবল অগভীর অপরিবর্তনীয়তার জন্য তৈরি করে, সুতরাং সমস্ত বৈশিষ্ট্যও যদি অপরিবর্তনীয় হয় তবে আপনাকে অবজেক্ট.ফ্রিজে ব্যবহার করতে হবে।
ক্লিন_কোডিং

3
@ কোলরোবার্টস এর অর্থ হ'ল কোনও হিমায়িত অবজেক্টের মধ্যে অবজেক্টের মানগুলি (যেমন নেস্টেড অবজেক্টস) এখনও রূপান্তরিত হতে পারে। আরও তথ্যের জন্য mathiasbynens.be/notes/es6-const# নন-পরিবর্তনযোগ্য মূল্যবোধগুলি দেখুন ।
ম্যাথিয়াস বাইনেস

19

আমার ES6 constএ অপরিবর্তনযোগ্যতা পোস্ট সম্পর্কে নয় , আমি অনুমানconst অনুযায়ী ঠিক কী বোঝায়।

উদ্দেশ্যমূলক তথ্যের ভিত্তিতে, এখানে আমার ব্যক্তিগত পছন্দ:

[…] এটি আপনার ইএস code কোডে ব্যবহার করে letএবং নীচের constহিসাবে বিবেচনা করে:

  • constডিফল্ট হিসাবে ব্যবহার করুন
  • কেবলমাত্র letরিব্যান্ডিং (অর্থাত্ পুনরায় নিয়োগের কোনও রূপ) প্রয়োজন হলে ব্যবহার করুন
  • ( varES6 এ ব্যবহার করা উচিত নয়)

বিষয় হিসাবে এটি হতে পারে, এটি একটি সত্য যে এটি সুনির্দিষ্টভাবে নকশার উদ্দেশ্যটির সাথে মিলে।

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

constশুধুমাত্র ধ্রুবকগুলির জন্য ব্যবহার করা কেবলমাত্র পার্শ্ব বারের সামগ্রীর জন্য এইচটিএমএল <aside>উপাদান ব্যবহার করার মতো ।


2
constধ্রুব না হলে কেন কোনও নাম রাখবেন?
এভেরেস্ট

3
@nueverest কারণ না কি constজন্য হয়। আপনি কি উপরের পড়েন?
ম্যাথিয়াস বাইনেন্স

2
@ ম্যাথিয়াসবাইনেন্স আমি মনে করি যে (কেবল?) সমস্যাটি constএটিই বলা হয়েছিল const। এটি একটি বোবা নাম (জাভাস্ক্রিপ্টে) যা প্রথমে অনেকগুলি (সমস্ত?) বিকাশকারীকে বিভ্রান্ত করে। আইএমও আরও ভাল হত যদি constতাকে ডাকা হত let(বিশেষত letছোট কারণ তবে constএটি আরও বেশি সাধারণ) এবং letঅন্য কিছু বলা হয়।
MrN00b

@ ম্যাথিয়াসবিনেন্সগুলি আমি পেয়েছি তবে কেন এটি কল? এই পৃষ্ঠাটি প্রদর্শিত হিসাবে এটি একটি বিরাট পরিমাণ বিভ্রান্তি তৈরি করছে।
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", যে পাঠক রত পারে চিন্তা মধ্যে 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কীওয়ার্ড ব্যবহার করা আমাদের আরও সুরক্ষা দেয় যা অবশ্যই আরও শক্তিশালী অ্যাপ্লিকেশনগুলির দিকে পরিচালিত করবে।

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