জাভাস্ক্রিপ্টে বৈশিষ্ট্য অনুসারে বাছাই করা হয়েছে


15

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

কীগুলি সংখ্যা বা স্ট্রিংগুলি যখন সংখ্যা হিসাবে কাস্ট করা যায় তখন সমস্যা দেখা দেয়।

যখন আমি এই কোডটি চালাই:

var test1 = {4294966222:"A",4294966333:"A",4294966111:"A"};
var test2 = {4294968222:"A",4294968333:"A",4294968111:"A"};
        
for (var k in test1) {console.log(k);}
console.log("---");
for (var k in test2) {console.log(k);}

আউটপুটটি হ'ল:

4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111

যার অর্থ:

  • (test1) কীগুলি যদি 2 ^ 32 (4,294,967,296) এর নীচে থাকে তবে সেগুলি স্বয়ংক্রিয়ভাবে পুনঃক্রম হয়, প্রথমে ক্ষুদ্রতম
  • (test2) কীগুলি যদি 2 ^ 32 এর উপরে হয় তবে সেগুলি পুনরায় অর্ডার করা হয় না।

প্রশ্ন হ'ল কেন এমন হচ্ছে?

যেহেতু আমি পরীক্ষিত সমস্ত ব্রাউজারগুলি (গুগল ক্রোম .0৯.০, মোজিলা ফায়ারফক্স .0১.০, মাইক্রোসফ্ট এজ ৪৪.১৩8362২, ইন্টারনেট এক্সপ্লোরার ১১.৫৩৫) এই আউটপুট সম্পর্কে একমত, তাই এখানে কিছু সরকারী বিবরণ থাকতে হবে।

হালনাগাদ

এটি একটি প্রান্তিক বিষয় ছিল তা খুঁজে বের করার আগে আমি প্রচুর সংখ্যা পরীক্ষা করেছিলাম। আমি অদ্ভুত দেখতে পেলাম যে ক্রমটি 2,3,1 একইভাবে অর্ডার করা তিন টাইমস্ট্যাম্পগুলির চেয়ে আলাদা আচরণ করে।


আমার অনুমান হ্যাশ কোডটি কীভাবে গণনা করা হয়, তবে এটি আপনার প্রশ্নের আসল উত্তর নয়।
মারিও ভার্নারি

1
আমি মনে করি না যে এটি শব্দের আসল কথাবার্তা ভাঙ্গা ভাঙ্গা হয়েছে, তারা গ্যারান্টি দেয় না যে মানগুলি আদেশ অনুসারে পুনরাবৃত্তি হবে যেহেতু এটি নির্বিচারে চলবে কারণ আপনি বিকাশকারীকে পরীক্ষা করতে পারেন। মোমজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভাস্ক্রিপ্ট / রেফারেন্স /… "দ্রষ্টব্য: ইন ... এর জন্য সূচী ক্রমটি গুরুত্বপূর্ণ যেখানে এমন অ্যারেতে পুনরাবৃত্তি করতে ব্যবহার করা উচিত নয়" " তারা সংগ্রহের প্রতিটি উপাদানকে কেবল পুনরাবৃত্তি নিশ্চিত করে। ফরএচ-এর মতো কিছু প্রকৃতপক্ষে ক্রমবর্ধমান ক্রমে আইটেমগুলি ট্র্যাভার করে
রাখে

রেকর্ডের জন্য, আপনি সরাসরি লগ ইন করে test1এবং দেখতে পারেন test2। আমি মনে করি "ইস্যু "টি অনুমানটির ভি 8 বাস্তবায়নের মূল ক্যাশিং থেকে এসেছে।
সেবলর

এটি আরও বেশি যে 2 ^ 32 এর নীচে আপনার সম্পত্তির নামটি সহজাতভাবে অভ্যন্তরীণ সম্পত্তি রেফারেন্সগুলির অনুরূপ অর্ডার করা হয়। সংজ্ঞা অনুসারে অর্ডার করা হয় না এবং আপনি বস্তুগত বৈশিষ্ট্যগুলি অন্তর্নিহিত এমন বৈশিষ্ট্যগুলি ধারণ করতে পারেন বলে আপনি বস্তুর বৈশিষ্ট্যগুলির ক্রমের উপর নির্ভর করতে পারবেন না should আপনার অবজেক্টটিকে সর্বদা একটি অ্যারেতে কাস্ট / ম্যাপ করুন, অ্যারেটিকে বাছাই করুন, তারপরে ক্রমটি গুরুত্বপূর্ণ হলে লুপ করুন।
ব্যবহারকারীর 15154108

1
@ Mr.Toxy ছিল এসব সম্পদ কারণ 4294968333এবং 4294968111তার চেয়ে অনেক বেশী হয় 2 ** 32(যা 4294967296)। সুতরাং, তারা অ্যারে সূচক নয়, সুতরাং তারা সংখ্যার ক্রমের পরিবর্তে সম্পত্তি তৈরির ক্রমে পুনরাবৃত্তি করেছে - যা প্রত্যাশার মতো তারা ফ্রেডে করছে। (আমার উত্তর দেখুন)
পারফরম্যান্স

উত্তর:


4

এটি প্রত্যাশিত প্রতি স্পেসিফিকেশন এমন পদ্ধতিতে বৈশিষ্ট্য উপর iterates, OrdinaryOwnPropertyKeys, আছে:

  1. ও এর প্রতিটি নিজস্ব কী-এর পি এর জন্য এটি একটি অ্যারে সূচক , আরোহী সংখ্যার সূচক ক্রমে, করুন

    ক। কীগুলির শেষ উপাদান হিসাবে পি যুক্ত করুন।

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

    ক। কীগুলির শেষ উপাদান হিসাবে পি যুক্ত করুন।

আরোহী সংখ্যাসূচক অর্ডার কেবল এমন বৈশিষ্ট্যগুলির জন্য প্রযোজ্য যা অ্যারে সূচকগুলি।

সুতরাং, একটি "অ্যারে সূচক" কি? এটি দেখুন ::

একটি পূর্ণসংখ্যা সূচক হ'ল স্ট্রিং-মূল্যবান প্রপার্টি কী যা মূলত সংখ্যাসূচক স্ট্রিং (দেখুন 7.1.21) এবং যার সংখ্যার মান হয় +0 বা ধনাত্মক পূর্ণসংখ্যা ≤ 2 ^ 53 - 1 মান i +0 ≤ i <2 ^ 32 - 1 এর মধ্যে রয়েছে।

সুতরাং, 2 ^ 32 এর চেয়ে বেশি সংখ্যার বৈশিষ্ট্যগুলি অ্যারে সূচক নয় এবং তাই সম্পত্তি তৈরির ক্রমে পুনরাবৃত্তি হয়। যাইহোক, সাংখ্যিক বৈশিষ্ট্য যে কম হয় 2^32 হয় অ্যারের indicies, এবং সাংখ্যিক অর্ডার আরোহী ওভার iterated করছে।

সুতরাং, উদাহরণস্বরূপ:

1: অ্যারে সূচক, সংখ্যা অনুযায়ী পুনরাবৃত্তি হবে

10: অ্যারে সূচক, সংখ্যা অনুযায়ী পুনরাবৃত্তি হবে

4294968111: এর চেয়েও বড় 2 ** 32, এর পরে পুনরাবৃত্তি হবে গুণ তৈরির ক্রমে অ্যারে সূচকগুলি শেষ

9999999999999: এর চেয়েও বড় 2 ** 32, এর পরে পুনরাবৃত্তি হবে গুণ তৈরির ক্রমে অ্যারে সূচকগুলি শেষ

এছাড়াও, যে, জনপ্রিয় বিশ্বাসের বিপক্ষে, সম্পত্তি পুনরাবৃত্তির অর্ডার মনে রাখা হয় স্পেসিফিকেশন দ্বারা হিসাবে ভাল নিশ্চিত, ধন্যবাদ জন্য-ইন পুনরাবৃত্তির প্রস্তাব যা পর্ব 4 হয়।


2

এটি কোনও বস্তুর কীগুলি যেভাবে ট্রান্সক্রিপড হয় তা করতে হবে।

ES6 নির্দিষ্টকরণ অনুসারে এটি হওয়া উচিত:

9.1.12 [[OwnPropertyKeys]] ( )

When the [[OwnPropertyKeys]] internal method of O is called the following steps are taken:

    Let keys be a new empty List.
    For each own property key P of O that is an integer index, in ascending numeric index order
        Add P as the last element of keys.
    For each own property key P of O that is a String but is not an integer index, in property creation order
        Add P as the last element of keys.
    For each own property key P of O that is a Symbol, in property creation order
        Add P as the last element of keys.
    Return keys.

http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys

এর অর্থ যদি একটি কী এর মান একই থাকে যদি স্বাক্ষরিত স্বাক্ষরিত 53 বিট সংখ্যায় রূপান্তরিত হয় এবং ফিরে এটি একটি পূর্ণসংখ্যা সূচক হিসাবে গণ্য করা হয় যা আরোহণের সংখ্যায় ক্রমে সাজানো হয়।

যদি এটি ব্যর্থ হয় তবে এটি একটি স্ট্রিং কী হিসাবে বিবেচিত হবে, যা সেগুলিকে যাতে বস্তুটিতে যুক্ত করার আদেশ দেওয়া হয়।

এখানে ধরা হল যে সমস্ত বড় ব্রাউজারগুলি এখনও এই স্পেসিফিকেশন অনুসরণ করে না এবং এর পরিবর্তে একটি অ্যারে সূচক ব্যবহার করে যা ইতিবাচক সংখ্যা পর্যন্ত সীমাবদ্ধ 2 ^ 32-1। সুতরাং যে সীমা উপরে কিছু আসলে একটি স্ট্রিং কী।

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