मुझे एक जावास्क्रिप्ट ऑब्जेक्ट के माध्यम से लूप करने की आवश्यकता है जो इसे कस्टम कुंजियों के साथ एक सरणी के रूप में मानता है। मुझे पता है कि यह पूरी तरह से समर्थित नहीं है, क्योंकि गुणों का कोई सहज आदेश नहीं है, लेकिन जब से मैं हमेशा गुणों को फिर से व्यवस्थित करता हूं, मुझे यह दृष्टिकोण सरल और विश्वसनीय लगा ... अब तक।
समस्या तब होती है जब कुंजियाँ संख्याएँ होती हैं, या तार जिन्हें संख्याओं के रूप में डाला जा सकता है।
जब मैं यह कोड चलाता हूं:
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 से ऊपर हैं, तो वे पुनः क्रमबद्ध नहीं हैं।
सवाल यह है कि ऐसा क्यों हो रहा है?
चूंकि सभी ब्राउज़रों का मैंने परीक्षण किया (Google Chrome 79.0, मोज़िला फ़ायरफ़ॉक्स 71.0, Microsoft एज 44.18362, इंटरनेट एक्सप्लोरर 11.535) इस आउटपुट के बारे में सहमत हैं, इसलिए कुछ आधिकारिक विनिर्देश होना चाहिए।
अपडेट करें
मैंने यह पता लगाने से पहले बहुत सी संख्याओं का परीक्षण किया कि यह एक थ्रेशोल्ड मामला है। मुझे अजीब लगा कि अनुक्रम 2,3,1 एक ही तरह से आदेशित तीन टाइमस्टैम्प से अलग व्यवहार करता है।
test1और test2। मुझे लगता है कि "मुद्दा" वी के कार्यान्वयन में महत्वपूर्ण कैशिंग से है।
4294968333और (जो है ) 4294968111से अधिक हैं । इसलिए, वे सरणी संकेत नहीं देते हैं, इसलिए वे संख्यात्मक निर्माण क्रम में होने के बजाय संपत्ति निर्माण क्रम में पुनरावृत्त होते हैं - जो कि जैसा वे उम्मीद कर रहे हैं, ठीक वैसा ही वे कर रहे हैं। (मेरा उत्तर देखें)2 ** 324294967296
