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




w3schools (8)

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

ECMAScript স্পেসিফিকেশন বলতে ব্যবহৃত হয়:

বৈশিষ্ট্যের enumerating যান্ত্রিকতা এবং আদেশ ... নির্দিষ্ট করা হয় না।

তবে ES2015 এবং পরে অ-পূর্ণসংখ্যা কী সন্নিবেশ আদেশে ফেরত দেওয়া হবে।

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

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

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

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

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


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

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 ব্যবহার করুন।


আধুনিক ব্রাউজারে আপনি একটি বস্তুর পরিবর্তে Map তথ্য গঠন ব্যবহার করতে পারেন।

বিকাশকারী মোজিলা> মানচিত্র

একটি মানচিত্র বস্তু সন্নিবেশ ক্রম তার উপাদান পুনরাবৃত্তি করতে পারেন ...


JSON স্ট্যান্ডার্ড থেকে :

একটি বস্তু শূন্য বা আরও নাম / মান জোড়াগুলির একটি অকার্যকর সংগ্রহ, যেখানে একটি নাম একটি স্ট্রিং এবং একটি মান একটি স্ট্রিং, সংখ্যা, বুলিয়ান, নাল, বস্তু, বা অ্যারে।

(জোর খনি)।

সুতরাং, না আপনি অর্ডার গ্যারান্টি পারেন না।


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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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







javascript