javascript - tutorial - w3schools




জাভাস্ক্রিপ্ট গ্যারান্টি বস্তুর সম্পত্তি আদেশ কি? (7)

ES2015 এ, এটি কি তবে আপনি যা ভাবতে পারেন তা নয়

কোনও বস্তুর কীগুলির আদেশ ES2015 পর্যন্ত নিশ্চিত করা হয়নি। এটি বাস্তবায়ন-সংজ্ঞায়িত ছিল।

তবে, ES2015 মধ্যে নির্দিষ্ট করা হয়েছিল । জাভাস্ক্রিপ্টে অনেক কিছু ভালো লেগেছে, এটি সামঞ্জস্যের উদ্দেশ্যে কাজ করে এবং সাধারণত বেশিরভাগ JS ইঞ্জিনগুলির মধ্যে একটি বিদ্যমান অননুমোদিত মানকে প্রতিফলিত করে (আপনার সাথে-কে-ব্যতিক্রম বলে)।

ক্রমটি সংজ্ঞায়িত করা হয়, বিমূর্ত অপারেশন OrdinaryOwnPropertyKeys অধীনে, যা কোন বস্তুর নিজস্ব কীগুলির উপর পুনরাবৃত্তি করার সমস্ত পদ্ধতিগুলিকে অন্তর্ভূক্ত করে। Paraphrased, আদেশ নিম্নরূপ:

  1. সমস্ত পূর্ণসংখ্যা সূচক কী ( "1123" , "55" , ইত্যাদির মতো উপাদান) আরোহী সংখ্যাসূচক ক্রম।

  2. সমস্ত স্ট্রিং কী যা পূর্ণসংখ্যা সূচক নয়, সৃষ্টির (পুরনো-প্রথম) ক্রম অনুসারে।

  3. সমস্ত প্রতীক চাবি, সৃষ্টির (প্রাচীনতম) প্রথম।

অর্ডারটি অবিশ্বাস্য - এটি নির্ভরযোগ্য নয় - এটি নির্ভরযোগ্য, এটি সম্ভবত আপনি যা চান তা নয় এবং আধুনিক ব্রাউজার সঠিকভাবে এই আদেশটি বাস্তবায়ন করে।

কিছু ব্যতিক্রমের মধ্যে উত্তরাধিকারসূত্রে কী কীভাবে বর্ণনা করা যায়, যেমন লুপ। for .. in লুপ মধ্যে স্পেসিফিকেশন অনুযায়ী অর্ডার গ্যারান্টি না।

যদি আমি এই মত একটি বস্তু তৈরি করি:

var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";

ফলে বস্তু সবসময় এই মত চেহারা হবে?

{ prop1 : "Foo", prop2 : "Bar" }

অর্থাৎ, সম্পত্তি কি একই ক্রমের মধ্যে থাকবে যা আমি তাদের যোগ করেছি?


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

var myarr = [{somfield1: 'x', somefield2: 'y'},
{somfield1: 'a', somefield2: 'b'},
{somfield1: 'i', somefield2: 'j'}];

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


এই পুরো উত্তর স্পেক সম্মতি প্রেক্ষাপটে, কোনো ইঞ্জিন কোন নির্দিষ্ট মুহূর্তে বা ঐতিহাসিকভাবে কি না।

সাধারণত, না

প্রকৃত প্রশ্ন খুব অস্পষ্ট।

বৈশিষ্ট্য একই ক্রম হবে যে আমি তাদের যোগ করা হবে

কোন প্রসঙ্গে?

উত্তর হল: এটি বেশ কয়েকটি কারণের উপর নির্ভর করে। সাধারণভাবে, না

কখনও কখনও হ্যাঁ

এখানে আপনি প্লেইন Objects জন্য সম্পত্তি কী অর্ডারে গণনা করতে পারেন:

  • ES2015 অনুবর্তী ইঞ্জিন
  • নিজস্ব বৈশিষ্ট্য
  • Object.getOwnPropertyNames() , Reflect.ownKeys() , Object.getOwnPropertySymbols(O)

সব ক্ষেত্রেই এই পদ্ধতিগুলির মধ্যে [[OwnPropertyKeys]] দ্বারা উল্লেখ করা হিসাবে অ-সংখ্যাসূচক সম্পত্তি কী এবং ক্রম কী অন্তর্ভুক্ত রয়েছে (নীচে দেখুন)। তারা যে মূল মানগুলি অন্তর্ভুক্ত করে সেগুলির মধ্যে তারা ভিন্ন ( String এবং / অথবা Symbol )। এই প্রেক্ষাপটে String পূর্ণসংখ্যা মান রয়েছে।

Object.getOwnPropertyNames(O)

O এর নিজস্ব String লাগানো বৈশিষ্ট্য ( সম্পত্তি নাম ) প্রদান করে।

Reflect.ownKeys(O)

O এর নিজস্ব String - এবং Symbol বানানো বৈশিষ্ট্যগুলি প্রদান করে।

Object.getOwnPropertySymbols(O)

O এর নিজস্ব Symbol কুপিত বৈশিষ্ট্য প্রদান করে।

[[OwnPropertyKeys]]

ক্রমটি মূলতঃ ক্রমবর্ধমান ক্রমের পূর্ণসংখ্যা-মতো Strings , সৃষ্টি ক্রমের অ-পূর্ণসংখ্যা-মতো Strings , সৃষ্টি ক্রমের প্রতীক। কোন ফাংশনটি এটিকে আহ্বান করে তার উপর নির্ভর করে এই ধরনের কিছু অন্তর্ভুক্ত করা যাবে না।

নির্দিষ্ট ভাষা হল যেগুলি নিম্নলিখিত ক্রমে কীগুলি ফেরত দেওয়া হয়:

  1. ... প্রত্যেকটির নিজস্ব সম্পত্তি কী P [বস্তু পুনরাবৃত্তি করা] যা একটি পূর্ণসংখ্যা সূচক, আরোহী সাংখ্যিক সূচক ক্রম

  2. ... প্রতিটি নিজের সম্পত্তি কী P এর O যে স্ট্রিং কিন্তু একটি পূর্ণসংখ্যা সূচক নয়, সম্পত্তি তৈরির ক্রম

  3. ... প্রত্যেকের নিজের সম্পত্তি কী P এর একটি প্রতীক, সম্পত্তি তৈরির ক্রম

Map

যদি আপনি অর্ডারকৃত Map আগ্রহী হন তবে আপনাকে সাধারণ Objects পরিবর্তে ES2015 এ উপস্থাপিত Map ধরনটি ব্যবহার করা উচিত।


না, বস্তুর বৈশিষ্ট্যের ক্রম জাভাস্ক্রিপ্টে নিশ্চিত নয়; আপনি একটি Array ব্যবহার করতে হবে।

ECMAScript তৃতীয় সংস্করণ (পিডিএফ) থেকে একটি অবজেক্টের সংজ্ঞা:

4.3.3 বস্তু

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

ECMAScript 2015 থেকে , Map অবজেক্ট ব্যবহার করে একটি বিকল্প হতে পারে। একটি Map একটি Object সাথে কিছু সাদৃশ্য ভাগ করে এবং কী আদেশের নিশ্চয়তা দেয় :

একটি মানচিত্র সন্নিবেশ আদেশের মধ্যে তার উপাদানগুলিকে পুনরাবৃত্তি করে, অথচ পুনরাবৃত্তি আদেশ বস্তুর জন্য নির্দিষ্ট করা হয় না।


শুধু এই হার্ড উপায় খুঁজে পাওয়া যায় নি।

রেডক্সের সাথে প্রতিক্রিয়া ব্যবহার করে, সন্তানের উৎপন্ন করার জন্য যে কী কীগুলি আমি ট্রান্সক্রস করতে চাই তা কন্টেইনারে স্টোরটি পরিবর্তিত হয় (রেডক্সের অপূর্ণতা ধারণা অনুসারে)।

সুতরাং, Object.keys(valueFromStore) গ্রহণ করার জন্য আমি Object.keys(valueFromStore).sort() , যাতে আমার অন্তত এখন কীগুলির জন্য একটি বর্ণানুক্রমিক ক্রম আছে।


স্বাভাবিক বস্তুর মধ্যে সম্পত্তি আদেশ জাভাস্ক্রিপ্ট একটি জটিল বিষয়।

ES5 স্পষ্টভাবে কোন আদেশ নির্দিষ্ট করা হয়েছে, ES2015 নির্দিষ্ট ক্ষেত্রে একটি আদেশ আছে। নিম্নলিখিত বস্তু দেওয়া হয়:

o = Object.create(null, {
  m: {value: function() {}, enumerable: true},
  "2": {value: "2", enumerable: true},
  "b": {value: "b", enumerable: true},
  0: {value: 0, enumerable: true},
  [Symbol()]: {value: "sym", enumerable: true},
  "1": {value: "1", enumerable: true},
  "a": {value: "a", enumerable: true},
});

এই নিম্নলিখিত ক্রম ফলাফল (নির্দিষ্ট ক্ষেত্রে):

Object {
  0: 0,
  1: "1",
  2: "2",
  b: "b",
  a: "a",
  m: function() {},
  Symbol(): "sym"
}
  1. চূড়ান্ত ক্রম পূর্ণসংখ্যা মত কী
  2. সন্নিবেশ আদেশ স্বাভাবিক কী
  3. সন্নিবেশ আদেশ প্রতীক

সুতরাং, তিনটি বিভাগ রয়েছে, যা সন্নিবেশ আদেশ পরিবর্তন করতে পারে (উদাহরণ হিসাবে ঘটেছে)। এবং পূর্ণসংখ্যা-মত কীগুলি সন্নিবেশ আদেশের সাথে আটকাতে পারে না।

প্রশ্ন হল, এই পদ্ধতি কি ES2015 spec নিশ্চিত করা হয়?

নিম্নলিখিত পদ্ধতি দেখানো আদেশ গ্যারান্টি:

  • Object.assign
  • Object.defineProperties
  • Object.getOwnPropertyNames
  • Object.getOwnPropertySymbols
  • Reflect.ownKeys

নিম্নলিখিত পদ্ধতি / loops সব কোন আদেশ গ্যারান্টি:

  • Object.keys
  • এ জন্য
  • JSON.parse
  • JSON.stringify

উপসংহার: এমনকি ES2015 তেও আপনি জাভাস্ক্রিপ্টে স্বাভাবিক বস্তুর সম্পত্তি আদেশের উপর নির্ভর করতে পারবেন না। এটা ত্রুটি প্রবণ হয়। পরিবর্তে Map ব্যবহার করুন।


বর্তমান ভাষা স্পিক : টেকনিক্যালি, আদেশ অনির্দিষ্ট হয়।

বর্তমান ব্রাউজার : ক্রমটির মূল ব্যতিক্রম যেমন "7" সংখ্যার সাথে সংরক্ষণ করা হয় যা পূর্ণসংখ্যা হিসাবে পার্স এবং Chrome / V8 দ্বারা আলাদাভাবে পরিচালিত হয়।

ভবিষ্যত ভাষা স্পিক (> ES2015) : সাধারণত, আপনি আজ অর্ডার দেওয়া জিনিস unordered পরিণত হবে না আশা করতে পারেন। নতুন API গুলি গ্যারান্টি দেবে; বিদ্যমান API পরিবর্তন করা কঠিন। আরো বিস্তারিত জানার জন্য জেএমএম এর উত্তর দেখুন।

নীচের সেরা লিঙ্কটি টিম ডাউন এর মন্তব্যে রয়েছে:

http://code.google.com/p/v8/issues/detail?id=164

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

প্রতি (বরং মতামত) মন্তব্য এক:

মান সবসময় বাস্তবায়ন অনুসরণ করে, যেখানে এক্সএইচআর এসেছে, এবং গুইয়ারটি একইভাবে Gears প্রয়োগ করে এবং তারপরে সমতুল্য HTML5 কার্যকারিতা গ্রহণ করে। সঠিক ফিক্স ECMA আনুষ্ঠানিকভাবে পরবর্তী পরবর্তী সংস্করণে ডি-ফ্যাক্টো মান আচরণ অন্তর্ভুক্ত করে।

যদি আপনি সন্নিবেশ আদেশের উপর নির্ভর করেন, তবে আপনি ECMAScript spec এর বাইরে আছেন তবে সাধারণ কী ব্রাউজার আচরণের ডি-ফ্যাক্টো স্ট্যান্ডার্ডের মধ্যে আপনার কীগুলি পূর্ণসংখ্যা হিসাবে পার্স না করা পর্যন্ত






javascript