javascript - কেন জাভাস্ক্রিপ্ট একটি স্ট্রিংয়ের একটি অ্যারেকে স্ট্রিংতে রূপান্তর করে, যখন কোনও বস্তু কী হিসাবে ব্যবহৃত হয়?




(3)

আমি এমন দৃশ্যে দৌড়েছি যেখানে জাভাস্ক্রিপ্ট এমনভাবে আচরণ করে যা কিছুটা আমার কাছে বিস্মিত হয়।

ধরা যাক আমাদের দুটি কী এবং ফু দিয়ে একটি অবজেক্ট আছে।

a = { foo: 1, bar: 2 }

তারপরে, আমার কাছে স্ট্রিংগুলির একটি অ্যারে রয়েছে, এই ক্ষেত্রে একটি 'ফু'

b = ['foo']

আমি নিম্নলিখিত আশা করব:

a[b] == undefined
a[b[0]] == 1

কিন্তু, এটিই ঘটে:

a[b] == 1
a[b[0]] == 1

কী হিসাবে জাভাস্ক্রিপ্ট কেন ['foo'] -> 'foo' কী হিসাবে ব্যবহৃত হয়?

সেখানকার কেউ কি এর কারণ জানেন?

এই কিভাবে প্রতিরোধ করা যায়?

let a = { foo: 1, bar: 2 }
let b = ['foo']

console.log(a[b] == 1)    // expected a[b] to be undefined
console.log(a[b[0]] == 1)  // expected a[b] to be 1


কী হিসাবে কোনও অ্যারে ব্যবহার করার সময়, জাভাস্ক্রিপ্ট সেই অ্যারের 'টু স্ট্রিং ()' পদ্ধতিটি কল করে এবং তারপরে অ্যারের স্ট্রিংযুক্ত সংস্করণটি কী হিসাবে সন্ধান করার চেষ্টা করবে। এবং যদি আপনি ['foo'].toString() কল করেন ['foo'].toString() আপনি দেখতে পাবেন যে এই পদ্ধতিটি "foo" ফিরিয়ে দেয়।


কী হিসাবে কোনও অ্যারে ব্যবহার করার সময়, জাভাস্ক্রিপ্ট সেই অ্যারের 'টু স্ট্রিং ()' পদ্ধতিটি কল করে এবং তারপরে অ্যারের স্ট্রিংযুক্ত সংস্করণটি কী হিসাবে সন্ধান করার চেষ্টা করবে। এবং যদি আপনি ['foo'] কল করেন। টু স্ট্রিং () আপনি দেখতে পাবেন যে এই পদ্ধতিটি "foo" ফিরিয়ে দেয়।


কী হিসাবে জাভাস্ক্রিপ্ট কেন ['foo'] -> 'foo' কী হিসাবে ব্যবহৃত হয়?
সেখানকার কেউ কি এর কারণ জানেন?

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

https://www.ecma-international.org/ecma-262/10.0/ এটি পোস্ট করার সময় সর্বাধিক বর্তমান ভাষার সংজ্ঞা।

প্রথমত, আপনি অ্যারে অ্যাক্সেস সম্পর্কিত অঞ্চলটি সন্ধান করতে চাইবেন। যদিও এটি ভাষা ভাষায় রয়েছে।

12.3.2.1 রানটাইম শব্দার্থক: মূল্যায়ন
সদস্যপ্রকাশ: সদস্যপদ [ এক্সপ্রেশন ]
...
3. সম্পত্তি নাম রেফারেন্স এক্সপ্রেশন মূল্যায়নের ফলাফল হতে দিন।
৪) সম্পত্তি নামভ্যালু হতে দিন ? গেটভ্যালু (সম্পত্তি নাম রেফারেন্স)
6. সম্পত্তি কি হতে দিন ? টোপ্রপার্টিকি (প্রপার্টি নেমভ্যালু)

সুতরাং, এখানে যা ঘটছে তা হল আপনি কোনও এক্সপ্রেশন দিয়ে [] ব্যবহার করে আপনার অ্যারে (সদস্য এক্সপ্রেসন) অ্যাক্সেস করছেন।

[] এর সাথে অ্যাক্সেসের জন্য এক্সপ্রেশনটি মূল্যায়ন করা হবে এবং তারপরে গেটভ্যালু কল করা হবে। তারপরে ToPropertyKey ডাকা হবে।

  1. প্রপার্টিমনাম রেফারেন্স = এক্সপ্রেশন মূল্যায়ন করুন b = b
  2. সম্পত্তিNameValue = getValue (সম্পত্তিNameReferences) = ['foo']
  3. সম্পত্তিKey = ToPropertyKey (সম্পত্তিNameValue) = 'foo'

ToPropertyKey, আমাদের পরিস্থিতিতে, ToPrimitive এবং তারপরে ToPrimitive বাড়ে যা বলে যে আমাদের যুক্তিতে " ['foo'] ToOrdinaryPrimitive " বলা উচিত (আমাদের ক্ষেত্রে ['foo'] call

এখান থেকেই বাস্তবায়নটি খেলতে আসে। বাস্তবায়নের পক্ষে,

অ্যারে অবজেক্ট অবজেক্টের টস্ট্রিং পদ্ধতিকে ওভাররাইড করে। অ্যারে অবজেক্টের জন্য, টস্ট্রিং পদ্ধতি অ্যারেতে যোগ দেয় এবং প্রতিটি অ্যারের উপাদানগুলি কমা দ্বারা পৃথক করে একটি স্ট্রিং প্রদান করে " এমডিএন - অ্যারে টু স্ট্রিং

অ্যারেতে যখন কেবল একটি মান থাকে, ফলাফলটি কেবল সেই মান হয়।

এই কিভাবে প্রতিরোধ করা যায়?

এটি বর্তমানে প্রয়োগ করা হয়। এটি পরিবর্তনের জন্য, আপনাকে অবশ্যই ডিফল্ট বাস্তবায়ন পরিবর্তন করতে হবে, কলটি প্রতিরোধ করতে সনাক্তকরণ ব্যবহার করতে হবে, বা কলটি প্রতিরোধের জন্য গাইডেন্স ব্যবহার করতে হবে।

পথপ্রদর্শন

আপনার কোডে কলিং ব্যবস্থা ডকুমেন্ট এবং প্রয়োগ করুন। এটি সর্বদা সম্ভব নাও হতে পারে। প্রোগ্রামাররা যদিও অ্যারে দিয়ে সম্পত্তি অ্যাক্সেসকে কল করবেন না এমন আশা করা খুব কম যুক্তিসঙ্গত।

সনাক্তকরণ

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

function ArrayAccess(value: string | number) {

এবং এটি যে কোনওটিকে অ্যাক্সেসর মান হিসাবে অ্যারে ব্যবহার করা থেকে বিরত করবে।

ডিফল্ট বাস্তবায়ন

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

var arrayToString = [].toString;
Array.prototype.toString = function(){
  if(this.length === 1) return;
  return arrayToString.call(this);
};

উদাহরণস্বরূপ বাস্তবায়ন পরিবর্তন করা আরও ভাল ধারণা নয়। এটি একটি পৃথক উত্তরে @ কোড ম্যানিয়াক দ্বারা আবৃত। "ব্যবহারিক পরিস্থিতিতে আপনার কখনই এই উচিত নয়" জানিয়েছে, যা আমিও সম্মত।






javascript