ইএস 6 এ প্রতীক আনার জন্য অনুপ্রেরণা কী?


368

আপডেট : সম্প্রতি মজিলার একটি উজ্জ্বল নিবন্ধ প্রকাশিত হয়েছে । আপনি কৌতূহলী হলে এটি পড়ুন।

আপনি জানেন যে তারা ECMAScript 6 তে নতুন সিম্বল আদিম ধরণের অন্তর্ভুক্ত করার পরিকল্পনা করছে (অন্য কোনও ক্রেজি স্টাফের কথা উল্লেখ না করে)। আমি সবসময় ভাবতাম যে :symbolরুবির ধারণাটি অযথা; আমরা জাভাস্ক্রিপ্টের মতো এর পরিবর্তে সহজেই সরল স্ট্রিংগুলি ব্যবহার করতে পারি। এবং এখন তারা সেই সাথে জেএসের জিনিসগুলিকে জটিল করার সিদ্ধান্ত নিয়েছে।

আমি অনুপ্রেরণা বুঝতে পারি না। কেউ কি আমাকে ব্যাখ্যা করতে পারেন যে আমাদের সত্যিই জাভাস্ক্রিপ্টে প্রতীক প্রয়োজন?


6
আমি এই ব্যাখ্যাটি কতটা সত্য তা জানি না তবে এটি একটি শুরু: tc39wiki.calculist.org/es6/symbols
ফেলিক্স ক্লিং

8
প্রতীকগুলি এতটা সক্ষম করে , তারা বস্তুগুলিতে স্কোপযুক্ত অনন্য শনাক্তকারীদের অনুমতি দেয়। উদাহরণস্বরূপ, কেবলমাত্র এক জায়গায় অ্যাক্সেসযোগ্য অবজেক্টগুলিতে বৈশিষ্ট্য রয়েছে।
বেনিয়ামিন গ্রুইনবাউম

5
এটি সম্পর্কে নিশ্চিত না যেহেতু আপনি Object.getOwnPropertySymbols (o) ব্যবহার করতে পারেন
ইয়ানিস

4
এটি গোপনীয়তার চেয়ে আরও স্বাতন্ত্র্য।
কোয়ান্টাস 94 ভারী

2
তারা আরও জটিল শ্রেণীর প্রয়োগ privateএবং publicক্লাসের বৈশিষ্ট্যযুক্ত কীওয়ার্ড সহ আরও জটিল জটিলতা অর্জন করবে যা তারা একটি সহজ শ্রেণীর প্রয়োগের জন্য খাঁজ করার সিদ্ধান্ত নিয়েছে। পরিবর্তে this.x = xআপনার করা উচিত ছিল public x = xএবং ব্যক্তিগত ভেরিয়েবলের জন্য private y = y। তারা আরও ন্যূনতম শ্রেণি বাস্তবায়নের জন্য এটিকে খাঁজ করার সিদ্ধান্ত নিয়েছে। প্রতীকটি তখন ন্যূনতম বাস্তবায়নে ব্যক্তিগত সম্পত্তি পাওয়ার জন্য প্রয়োজনীয় কাজ হতে পারে।
14

উত্তর:


224

জাভাস্ক্রিপ্টে প্রতীক প্রবর্তনের আসল প্রেরণা ছিল ব্যক্তিগত সম্পত্তি সক্রিয় করা।

দুর্ভাগ্যক্রমে, তারা মারাত্মকভাবে হ্রাস পেয়েছে। তারা আর ব্যক্তিগত নয়, যেহেতু আপনি এগুলি প্রতিবিম্বের মাধ্যমে খুঁজে পেতে পারেন, উদাহরণস্বরূপ, ব্যবহার Object.getOwnPropertySymbolsবা প্রক্সি।

এগুলি এখন অনন্য প্রতীক হিসাবে পরিচিত এবং তাদের একমাত্র উদ্দেশ্যে ব্যবহার হ'ল সম্পত্তিগুলির মধ্যে নামের সংঘাত এড়ানো। উদাহরণস্বরূপ, ECMAScript নিজেই এখন কিছু নির্দিষ্ট পদ্ধতির মাধ্যমে এক্সটেনশন হুকগুলি প্রবর্তন করতে পারে যা আপনি ব্যবহারকারীর নামের সাথে সংঘাতের ঝুঁকি না নিয়ে অবজেক্টগুলিতে (যেমন তাদের পুনরাবৃত্তির প্রোটোকলটি সংজ্ঞায়িত করতে পারেন) রাখতে পারেন on

এটি ভাষায় প্রতীক যুক্ত করার প্রেরণাটি যথেষ্ট শক্তিশালী কিনা তা বিতর্কযোগ্য।


93
বেশিরভাগ ভাষা (সমস্ত মূলধারার আফিক্স) যে কোনও উপায়ে ব্যক্তিগতভাবে অ্যাক্সেস পেতে কিছু মেকানিজম, সাধারণত প্রতিচ্ছবি সরবরাহ করে।
ইসাইলিজা

19
@ ইসাইলিজা, আমি সত্য বলে মনে করি না - বিশেষত, যেহেতু অনেকগুলি ভাষা প্রথম স্থানে প্রতিবিম্ব দেয় না। প্রতিবিম্বের মাধ্যমে ব্যক্তিগত অবস্থা ফাঁস করা (যেমন জাভায় যেমন) কোনও বাগ হিসাবে বিবেচনা করা উচিত, কোনও বৈশিষ্ট্য নয়। এটি ওয়েব পৃষ্ঠাগুলিতে বিশেষত সত্য, যেখানে নির্ভরযোগ্য ব্যক্তিগত রাষ্ট্র থাকা সুরক্ষা-প্রাসঙ্গিক হতে পারে। বর্তমানে, জেএসে এটি অর্জনের একমাত্র উপায় হ'ল ক্লোজার, যা উভয়ই ক্লান্তিকর এবং ব্যয়বহুল হতে পারে।
আন্ড্রেস রসবার্গ

38
প্রক্রিয়াটির প্রতিচ্ছবি হওয়ার দরকার নেই - সি ++, জাভা, সি #, রুবি, পাইথন, পিএইচপি, অবজেক্টিভ-সি সকলেই যদি সত্যিই চান তবে একভাবে বা অন্যভাবে অ্যাক্সেসের অনুমতি দেয়। এটি আসলে ক্ষমতা সম্পর্কে নয় তবে যোগাযোগের ক্ষেত্রে।
ইসাইলিজা

4
ওয়েবে প্লাটপ্স, প্ল্যাপেক্স কখনও কখনও সুরক্ষা সম্পর্কেও থাকে।
আন্দ্রেয়াস রসবার্গ

3
দুর্ভাগ্যক্রমে, রোল্যান্ডপিহলাকাস Object.getOwnPropertySymbolsকেবল একমাত্র ফুটো নয়; আরও জটিল একটি হ'ল "ব্যক্তিগত" সম্পত্তিতে অ্যাক্সেস আটকাতে প্রক্সিগুলি ব্যবহার করার ক্ষমতা।
আন্ড্রেস রসবার্গ

95

প্রতীকগুলি সত্য গোপনীয়তার গ্যারান্টি দেয় না তবে এগুলি সর্বজনীন এবং অভ্যন্তরীণ বৈশিষ্ট্যগুলিকে পৃথক করতে ব্যবহৃত হতে পারে। আসুন একটি উদাহরণ নেওয়া যাক যেখানে আমরা Symbolব্যক্তিগত সম্পত্তি থাকার জন্য ব্যবহার করতে পারি ।

আসুন একটি উদাহরণ নেওয়া যাক যেখানে কোনও সামগ্রীর সম্পত্তি ব্যক্তিগত নয়।

var Pet = (function() {
  function Pet(type) {
    this.type = type;
  }
  Pet.prototype.getType = function() {
    return this.type;
  }
  return Pet;
}());

var a = new Pet('dog');
console.log(a.getType());//Output: dog
a.type = null;
//Modified outside
console.log(a.getType());//Output: null

উপরে, Petশ্রেণীর সম্পত্তি typeব্যক্তিগত নয়। এটিকে ব্যক্তিগত করতে আমাদের একটি ক্লোজার তৈরি করতে হবে। নীচের উদাহরণটি ব্যাখ্যা করে যে আমরা কীভাবে typeবন্ধ ব্যবহার করে ব্যক্তিগত করতে পারি ।

var Pet = (function() {
  function Pet(type) {
    this.getType = function(){
      return type;
    };
  }
  return Pet;
}());

var b = new Pet('dog');
console.log(b.getType());//dog
b.type = null;
//Stays private
console.log(b.getType());//dog

উপরোক্ত পদ্ধতির অসুবিধা: আমরা Petতৈরি প্রতিটি উদাহরণের জন্য একটি অতিরিক্ত বন্ধের প্রবর্তন করছি , যা কার্য সম্পাদনকে ক্ষতি করতে পারে।

এখন আমরা পরিচয় করিয়ে দিই Symbol। এটি আমাদের অতিরিক্ত অপ্রয়োজনীয় বন্ধ ব্যবহার না করে কোনও সম্পত্তি ব্যক্তিগত রাখতে সহায়তা করতে পারে। নীচের কোড উদাহরণ:

var Pet = (function() {
  var typeSymbol = Symbol('type');
  function Pet(type) {
    this[typeSymbol] = type;
  }
  Pet.prototype.getType = function(){
    return this[typeSymbol];
  }
  return Pet;
}());

var a = new Pet('dog');
console.log(a.getType());//Output: dog
a.type = null;
//Stays private
console.log(a.getType());//Output: dog

15
লক্ষ করুন যে প্রতীক বৈশিষ্ট্যগুলি ব্যক্তিগত নয় ! প্রতীকগুলি সংঘর্ষমুক্ত । আপনি গ্রহণযোগ্য উত্তরটি পড়তে চাইতে পারেন।
বার্গি

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

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

10
আমি অর্থহীন বলব না, যেহেতু প্রতীকগুলি ডিফল্ট হিসাবে গণ্য হয় না, এছাড়াও এটি 'ভুল' দ্বারা অ্যাক্সেস করা যায় না, অন্য কোনও কী পারে key
প্যাট্রিক

5
আমি আপনার উত্তরটি কেবলমাত্র একটিই পেয়েছি যার আসলে একটি উদাহরণ রয়েছে যা বোধগম্য হয়, কেন আপনি কেবলমাত্র একটি সাধারণ বৈশিষ্ট্যের পরিবর্তে অবজেক্টের ব্যক্তিগত বৈশিষ্ট্যকে একটি চিহ্ন হিসাবে ব্যাখ্যা করতে চান।
লুইস লোবো বোরোবিয়া

42

Symbolsএকটি নতুন, বিশেষ ধরণের অবজেক্ট যা অবজেক্টগুলিতে একটি অনন্য সম্পত্তি নাম হিসাবে ব্যবহার করা যেতে পারে। এর Symbolপরিবর্তে ব্যবহার করা stringবিভিন্ন মডিউলকে এমন বৈশিষ্ট্য তৈরি করতে দেয় যা একে অপরের সাথে বিরোধ নয়। Symbolsএছাড়াও ব্যক্তিগত করা যেতে পারে, যাতে ইতিমধ্যে এর সরাসরি অ্যাক্সেস নেই এমন যে কেউ তাদের সম্পত্তিগুলি অ্যাক্সেস করতে পারবেন না Symbol

Symbolsএকটি নতুন আদিম । শুধু number, stringআর booleanপ্রিমিটিভের, Symbolএকটি ফাংশন যা তাদের তৈরি করতে ব্যবহার করা পারেন। অন্যান্য আদিম থেকে ভিন্ন, Symbolsআক্ষরিক বাক্য গঠন (যেমন কীভাবে stringআছে '') রাখবেন না - এগুলি তৈরির একমাত্র উপায় Symbolনিম্নলিখিত উপায়ে নির্মাণকারীর সাথে রয়েছে :

let symbol = Symbol();

বাস্তবে, Symbolকোনও বস্তুর সাথে সম্পত্তি যুক্ত করার জন্য কিছুটা আলাদা উপায় - আপনি সহজেই Symbolsস্ট্যান্ডার্ড পদ্ধতি হিসাবে সুপরিচিতভাবে সরবরাহ করতে পারেন , যেমনটি Object.prototype.hasOwnPropertyউত্তরাধিকারসূত্রে প্রাপ্ত সমস্ত কিছুর মধ্যে প্রদর্শিত হয় Object

এখানে Symbolআদিম ধরণের কিছু সুবিধা রয়েছে ।

Symbols ডিবাগিবিলিটি বিল্ট ইন

Symbols একটি বিবরণ দেওয়া যেতে পারে, যা কনসোলে লগ ইন করার সময় জীবনকে আরও সহজ করার জন্য সবেমাত্র ডিবাগিংয়ের জন্য ব্যবহৃত হয়।

SymbolsObjectকী হিসাবে ব্যবহার করা যেতে পারে

এখানেই Symbolসত্যই আকর্ষণীয় হয়ে উঠেছে। এগুলি বস্তুগুলির সাথে ভারী জড়িত। Symbolবস্তু কী হিসেবে নিয়োগ করা যেতে পারে, যার অর্থ আপনি অনন্য সীমাহীন সংখ্যক ধার্য করতে পারেন Symbolএকটা অবজেক্ট 's এবং নিশ্চিত করা যে এই সঙ্গে কখনো দ্বন্দ্ব হবে stringকি, বা অন্যান্য অনন্য Symbols

Symbols একটি অনন্য মান হিসাবে ব্যবহার করা যেতে পারে।

আসুন অনুমান আপনি একটি লগিং গ্রন্থাগার, যা যেমন একাধিক লগ মাত্রা অন্তর্ভুক্ত আছে logger.levels.DEBUG, logger.levels.INFO, logger.levels.WARNইত্যাদি। ইএস 5 কোডে আপনি এই stringগুলি (তাই logger.levels.DEBUG === 'debug') বা numberগুলি তৈরি করতে চাইবেন logger.levels.DEBUG === 10। এগুলি উভয়ই আদর্শ নয় কারণ সেই মানগুলি অনন্য মূল্য নয়, তবে Symbolএস! সুতরাং logger.levelsসহজভাবে হয়ে যায়:

log.levels = {
  DEBUG: Symbol('debug'),
  INFO: Symbol('info'),
  WARN: Symbol('warn'),
};
log(log.levels.DEBUG, 'debug message');
log(log.levels.INFO, 'info message');

এই দুর্দান্ত নিবন্ধে আরও পড়ুন ।


10
আমি নিশ্চিত নই যে আমি আপনার উদাহরণটি বুঝতে পেরেছি এবং কেন আপনার প্রয়োজন হবে log.levels = {DEBUG: Symbol('debug')এবং সরলভাবে নয় log.levels = {DEBUG:'debug'}। শেষে এটি একই। আমি মনে করি এটি উল্লেখ করার মতো বিষয় যে কোনও অবজেক্টের কীগুলিতে পুনরাবৃত্তি করার সময় প্রতীকগুলি অদৃশ্য। এটি তাদের "জিনিস"
ভিসিএনসি

একটি সুবিধা হ'ল কেউ দুর্ঘটনাক্রমে একটি আক্ষরিক ব্যবহার করতে পারে না এবং বিশ্বাস করে যে এটি চিরকাল কাজ করবে। (দ্রষ্টব্য যে এটি সত্যই দৃ strong় তর্ক নয়, যেহেতু কেউ {}একই ফলাফলটি ব্যবহার করতে এবং অর্জন করতে পারে (অনন্য মূল্য হিসাবে), বা সম্ভবত সেই প্রকল্পে একটি আক্ষরিক পছন্দ হয়, বা আপনি প্রথমে ডকটি পড়ার প্রয়োজন বলতে পারেন I) ব্যক্তিগতভাবে মনে হয় এটি কোডে অনন্য অর্থের একটি ভাল পাঠযোগ্যতা সরবরাহ করে
আপেল আপেল

নোট করুন যখন অনন্য মান হিসাবে ব্যবহৃত হয়, অবজেক্ট আক্ষরিকের মধ্যেও ডিবাজিবিলিটি থাকে অর্থাৎ Symbol("some message")হয়ে যায় {message:'some message'}, আপনি একাধিক ক্ষেত্র যুক্ত করতে পারলে যুক্তিযুক্তভাবে বস্তুটি এখানে আরও ভাল করে তোলে
আপেল আপেল

38

এই পোস্টটি হ'ল সম্পর্কে, যা Symbol()আমি খুঁজে পেতে / তৈরি করতে এবং সত্য এবং উদাহরণগুলি খুঁজে পেতে পারি তার উদাহরণ সহ সরবরাহ করা।

TLDR;

Symbol()ডাটা টাইপ, নাম ECMAScript 6 (ES6) এর রিলিজের সাথে চালু হয়।

সিম্বল সম্পর্কে দুটি কৌতূহলী তথ্য রয়েছে।

  • জাভাস্ক্রিপ্টে প্রথম ডেটা টাইপ এবং কেবলমাত্র ডেটা টাইপ যা কোনও আক্ষরিক হয়নি

  • যে কোনও ভেরিয়েবল, এর সাথে সংজ্ঞায়িত Symbol()হয়ে অনন্য সামগ্রী পেয়ে যায় তবে এটি আসলে ব্যক্তিগত নয়

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

আমি কীভাবে প্রতীকটির সূচনা করব?

1. ডিবাগযোগ্য মান সহ একটি অনন্য সনাক্তকারী পেতে To

আপনি এটি এইভাবে করতে পারেন:

var mySymbol1 = Symbol();

বা এইভাবে:

var mySymbol2 = Symbol("some text here");

"some text here"স্ট্রিং প্রতীক থেকে নিষ্কাশিত করা যাবে না, এটা ঠিক ডিবাগ করার উদ্দেশ্যে জন্য একটি বিবরণ আছে। এটি কোনওভাবেই প্রতীকের আচরণ পরিবর্তন করে না। যদিও, আপনি console.logএটি করতে পারেন (যা ন্যায্য, যেহেতু মানটি ডিবাগিংয়ের জন্য, যাতে অন্য কোনও লগ এন্ট্রি দিয়ে সেই লগটিকে ভুল না করে):

console.log(mySymbol2);
// Symbol(some text here)

২. কিছু স্ট্রিং ডেটার জন্য একটি চিহ্ন পেতে

এক্ষেত্রে প্রতীকটির মানটি আসলে বিবেচনায় নেওয়া হয় এবং এইভাবে দুটি প্রতীক অ-অনন্য হতে পারে।

var a1 = Symbol.for("test");
var a2 = Symbol.for("test");
console.log(a1 == a2); //true!

আসুন এই চিহ্নগুলিকে "দ্বিতীয় ধরণের" চিহ্নগুলি বলি। তারা কোনওভাবেই "প্রথম ধরণের" চিহ্নগুলি (যেমন সংজ্ঞায়িত চিহ্নগুলি Symbol(data)) দিয়ে ছেদ করে না ।

পরবর্তী দুটি অনুচ্ছেদে কেবল প্রথম ধরণের প্রতীক রয়েছে।

পুরানো ডেটা ধরণের পরিবর্তে সিম্বল ব্যবহার করে কীভাবে উপকৃত হব?

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

var persons = {"peter":"pan","jon":"doe"};
console.log(persons.peter);
// pan

পিটার নামটি সহ যদি আমাদের দুজন ব্যক্তি থাকে তবে কী হবে?

এটা করছি:

var persons = {"peter":"first", "peter":"pan"};

খুব একটা বোধগম্য হবে না।

সুতরাং, একই নামের দুটি একেবারে পৃথক ব্যক্তির সমস্যা বলে মনে হচ্ছে। এর পরে নতুন উল্লেখ করা যাক Symbol()। এটি বাস্তব জীবনের একজন ব্যক্তির মতো - যে কোনও ব্যক্তি অনন্য , তবে তাদের নাম সমান হতে পারে। আসুন দুটি "ব্যক্তি" সংজ্ঞায়িত করা যাক।

 var a = Symbol("peter");
 var b = Symbol("peter");

এখন আমরা একই নামের সাথে দুটি পৃথক ব্যক্তি পেয়েছি। আমাদের ব্যক্তিরা কি আসলেই আলাদা? তারা হয়; আপনি এটি পরীক্ষা করতে পারেন:

 console.log(a == b);
 // false

আমরা কীভাবে সেখানে উপকৃত হব?

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

 var firstPerson = Symbol("peter");
 var secondPerson = Symbol("peter");
 var persons = {[firstPerson]:"first", [secondPerson]:"pan"};

দ্রষ্টব্য:
এটি লক্ষ্য করার মতো, তবে এটির সাহায্যে অবজেক্টটির স্ট্রিংফাইং চিহ্নটি JSON.stringifyএকটি চিহ্ন হিসাবে সিম্বলযুক্ত সমস্ত জুটি বাদ দেবে।
এক্সিকিউটিং Object.keysহয় এই জাতীয় জুড়ি ফেরত দেয় না Symbol()->value

এই সূচনাটি ব্যবহার করে, প্রথম এবং দ্বিতীয় ব্যক্তিদের জন্য এন্ট্রিগুলি ভুল করা একেবারেই অসম্ভব। console.logতাদের জন্য কল করা তাদের দ্বিতীয় নামগুলি সঠিকভাবে আউটপুট করবে।

 console.log(persons[a]);
 // first
 console.log(persons[b]);
 // pan

যখন অবজেক্টে ব্যবহার করা হয়, তখন এটি গণনাযোগ্য সম্পত্তি সংজ্ঞায়নের তুলনায় কীভাবে আলাদা?

প্রকৃতপক্ষে, কোনও সম্পত্তি থেকে গোপনে থাকা Object.keysএবং গণনার সংজ্ঞা দেওয়ার একটি উপায় ইতিমধ্যে রয়েছে । এটা এখানে:

var anObject = {};
var fruit = "apple";    

Object.defineProperty( anObject, fruit, {
    enumerable: false,
    value: "green"
});

কি পার্থক্য Symbol()সেখানে এনেছে? পার্থক্যটি হ'ল আপনি এখনও সম্পত্তিটিকে Object.definePropertyসাধারণ উপায়ে সংজ্ঞায়িত করতে পারেন :

console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //green
console.log(anObject.apple); //green

এবং পূর্ববর্তী অনুচ্ছেদে যেমন সিম্বল দিয়ে সংজ্ঞায়িত করা হয়:

fruit = Symbol("apple");

আপনার ভেরিয়েবলটি জানা থাকলে কেবল তার মান পাওয়ার ক্ষমতা পাবেন

console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //undefined
console.log(anObject.apple); //undefined

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

রূপান্তর এবং পরীক্ষার টাইপ করুন

  • অন্যান্য ডেটা ধরণের থেকে পৃথক, অন্য কোনও ডেটা ধরণে রূপান্তর করা অসম্ভব Symbol()

  • কল করে আদিম তথ্য প্রকারের ভিত্তিতে একটি প্রতীক "তৈরি" করা সম্ভব Symbol(data)

  • প্রকারটি পরীক্ষা করার ক্ষেত্রে কোনও পরিবর্তন হয় না।

    function isSymbol ( variable ) {
        return typeof someSymbol === "symbol";
    }
    
    var a_Symbol = Symbol("hey!");
    var totally_Not_A_Symbol = "hey";
    
    console.log(isSymbol(a_Symbol)); //true
    console.log(isSymbol(totally_Not_A_Symbol)); //false


এটি কি এসও ডকুমেন্টেশন থেকে স্থানান্তরিত হয়েছিল?
নু

1
@ কেএনইউ এটি ছিল না; আমি তথ্য সংগ্রহ করেছি এবং নিজেই এই উত্তরটি লিখেছি
নিকেল 20

সত্যিই সুন্দর উত্তর!
মিহাই আলেকজান্দ্রু-আয়নুত

1
সিম্বলটিতে দুর্দান্ত উত্তর, তবে আমি এখনও জানি না কেন আমি অ্যারের পরিবর্তে প্রতীক কী দিয়ে অবজেক্টটি ব্যবহার করব। আমার যদি multiple "পিটার": "প্যান"} {"জন": "ডু" এর মতো একাধিক ব্যক্তি থাকে তবে সেগুলিকে একটি বস্তুতে রাখা আমার পক্ষে খারাপ লাগে। আমি ফার্স্টনাম 1, পার্সোনফার্সনেম 2 এর মতো সদৃশ বৈশিষ্ট্য সহ ক্লাস না করায় একই কারণে। এটি স্ট্রাইফ করার অক্ষমতার সাথে মিলিত হয়ে আমি সুবিধাগুলি কেবল অসুবিধাগুলি দেখছি না।
লেডো

18

এখানে আমি এটি দেখতে কিভাবে। প্রতীকগুলি কিছু জনপ্রিয় পদ্ধতি যেমন অবজেক্ট.কিজ () এবং জেএসএন.স্ট্রিফাইফাই () এর মাধ্যমে কোনও বস্তুর কী / বৈশিষ্ট্যগুলি উন্মুক্ত হওয়া থেকে বিরত রেখে 'অতিরিক্ত স্তরের গোপনীয়তা' সরবরাহ করে।

var age = Symbol();  // declared in another module perhaps?
class Person {
   constructor(n,a){
      this.name = n;
      this[age] = a;  
   }
   introduce(){
       console.log(`My name is ${this.name}. I am ${this[age]-10}.`);
   }
}
var j = new Person('Jane',45);
j.introduce();  // My name is Jane. I am 35.
console.log(JSON.stringify(j)); // {"name":"Jane"}
console.log(Object.keys(j)); // ["name"]
console.log(j[age]); // 45   (well…only if you know the age in the first place…)

যদিও প্রতি সেজে কোনও বস্তু দেওয়া হলেও, এই জাতীয় বৈশিষ্ট্যগুলি এখনও প্রতিবিম্ব, প্রক্সি, অবজেক্ট.সেটঅউনপ্রোপার্টি সিম্বলস () ইত্যাদির মাধ্যমে উন্মোচিত হতে পারে, কয়েকটি সরাসরি পদ্ধতির মাধ্যমে এগুলি অ্যাক্সেস করার কোনও প্রাকৃতিক উপায় নেই যা কখনও কখনও ওওপি দৃষ্টিকোণ থেকে পর্যাপ্ত হতে পারে।


2

একটি জেএস প্রতীক একটি নতুন আদিম ডাটা টাইপ। তারা টোকেন যা অনন্য আইডি হিসাবে পরিবেশন করেSymbolকনস্ট্রাক্টর ব্যবহার করে একটি প্রতীক তৈরি করা যেতে পারে । উদাহরণস্বরূপ MDN থেকে এই স্নিপেট নিন:

// The symbol constructor takes one optional argument, 
// the descriptions which is used for debugging only.
// Here are two symbols with the same description
let Sym1 = Symbol("Sym");
let Sym2 = Symbol("Sym");
  
console.log(Sym1 == Sym2); // returns "false"
// Symbols are guaranteed to be unique.
// Even if we create many symbols with the same description,
// they are different values.

চিহ্নগুলি অনন্য বস্তুর সম্পত্তি কী হিসাবে ব্যবহার করা প্রায়শই সহজ y

let obj = {};
let prop = Symbol();

obj[prop] = 123;  // the symbol prop is assigned 123
obj.prop  = 456;  // the string prop is assigned 456

console.log(obj.prop, obj[prop]); // logs 456, 123


0

প্রতীকগুলির দুটি প্রধান ব্যবহারের মামলা রয়েছে:

  1. "লুকানো" অবজেক্টের বৈশিষ্ট্য। আমরা যদি অন্য কোনও স্ক্রিপ্ট বা লাইব্রেরির সাথে সম্পর্কিত "এমন কোনও বস্তুর মধ্যে কোনও সম্পত্তি যুক্ত করতে চাই, আমরা একটি প্রতীক তৈরি করতে এবং এটি সম্পত্তি কী হিসাবে ব্যবহার করতে পারি। একটি প্রতীকী সম্পত্তি উপস্থিত হয় না for..in, সুতরাং এটি অন্য সম্পত্তি সহ একসাথে ঘটবে না। এছাড়াও এটি সরাসরি অ্যাক্সেস করা হবে না, কারণ অন্য স্ক্রিপ্টটিতে আমাদের প্রতীক নেই। সুতরাং সম্পত্তিটি দুর্ঘটনাজনিত ব্যবহার বা ওভাররাইট থেকে সুরক্ষিত থাকবে।

    সুতরাং আমরা আমাদের প্রয়োজনীয় অবজেক্টগুলিতে কিছু "গোপনে" লুকিয়ে রাখতে পারি, তবে অন্যেরা প্রতীকী বৈশিষ্ট্য ব্যবহার করে দেখা উচিত নয়।

  2. জাভাস্ক্রিপ্ট দ্বারা ব্যবহৃত অনেকগুলি সিস্টেম প্রতীক রয়েছে যা হিসাবে অ্যাক্সেসযোগ্য Symbol.*। আমরা কিছু বিল্ট-ইন আচরণগুলি পরিবর্তনের জন্য সেগুলি ব্যবহার করতে পারি। উদাহরণস্বরূপ, ...... Symbol.iteratorপুনরাবৃত্তির জন্য, Symbol.toPrimitiveঅবজেক্ট-থেকে-আদিম রূপান্তর সেটআপ করা ইত্যাদি।

সূত্র

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