2010-09-03 20 views
43

ऐसा लगता है कि जब मैं किसी ऑब्जेक्ट में किसी कुंजी नाम के रूप में एक संख्यात्मक प्रकार का उपयोग करता हूं, तो यह हमेशा स्ट्रिंग में परिवर्तित हो जाता है। क्या वास्तव में इसे संख्यात्मक के रूप में स्टोर करने के लिए वैसे भी है? सामान्य टाइपकास्टिंग काम नहीं लग रहा है।क्या कोई ऑब्जेक्ट कुंजी ऑब्जेक्ट कुंजी के रूप में उपयोग करने का कोई तरीका है?

उदाहरण:

var userId = 1; 
console.log(typeof userId); // number 
myObject[userId] = 'a value'; 
console.dir(myObject); 

डिर आउटपुट:

{ 
    1: 'a value' 
} 

सलाह:

{ 
    '1': 'a value' 
} 

क्या मैं चाहते है?

धन्यवाद

उत्तर

48

नहीं, यह संभव नहीं है। कुंजी हमेशा स्ट्रिंग में परिवर्तित हो जाएगी। देखें Property Accessor docs

संपत्ति के नाम तार होना चाहिए। इसका मतलब है कि ऑब्जेक्ट में कुंजी के रूप में गैर स्ट्रिंग ऑब्जेक्ट्स का उपयोग नहीं किया जा सकता है। किसी भी गैर-स्ट्रिंग ऑब्जेक्ट, जिसमें एक संख्या शामिल है, को स्ट्रिंग विधि के माध्यम से स्ट्रिंग में टाइप किया गया है।

> var foo = {} 
undefined 

> foo[23213] = 'swag' 
'swag' 

> foo 
{ '23213': 'swag' } 

> typeof(Object.keys(foo)[0]) 
'string' 
+0

धन्यवाद। क्या यह भाषा में एक दोष माना जाता है, या इसे एक अच्छा डिजाइन निर्णय के रूप में स्वीकार किया जाता है? – Spot

+1

यह बल्कि व्यक्तिपरक है। विलियम ने नोट किया, पूर्णांक कुंजी के लिए आप इसके बजाय एक सरणी का उपयोग कर सकते हैं। अधिकांश जेएस इंजन दृश्यों के पीछे स्पैस एरे का उपयोग कर सकते हैं। –

+3

यहां तक ​​कि एक सरणी में, सभी संपत्ति नाम स्ट्रिंग में परिवर्तित हो जाते हैं। –

-3

जावास्क्रिप्ट में, संख्यात्मक तार और संख्या परस्पर विनिमय कर रहे हैं, इसलिए

myObject[1] == myObject['1'] 

तुम सच में नंबर एक वस्तु के लिए महत्वपूर्ण होने के लिए चाहते हैं, तो आप एक सरणी (यानी new Array() के साथ बनाया चाहते हो सकता है या [])।

+2

प्रतिक्रिया के लिए धन्यवाद लेकिन यह पूरी तरह सटीक नहीं है। एक संख्यात्मक केवल एक प्रकार से 'संख्या' के रूप में वापस आ जाएगा, और इसके विपरीत एक स्ट्रिंग के साथ। – Spot

+0

@ विल्लियम 'संख्यात्मक तार और संख्याएं अदला-बदली हैं' बस सही नहीं है। संख्याएं संख्याएं और स्ट्रिंग्स स्ट्रिंग्स हैं। 'Object.prototype.toString.call (someObject) देखें 'मुद्दा यह है कि आप संख्याओं को कुंजी के रूप में उपयोग नहीं कर सकते हैं। – mikemaccana

7

ECMA-262-5 में डिजाइन द्वारा प्रतीत होता है:

संपत्ति पहचानकर्ता प्रकार एक संपत्ति डिस्क्रिप्टर के साथ एक संपत्ति नाम संबद्ध करने के लिए प्रयोग किया जाता है। संपत्ति पहचानकर्ता प्रकार के मान फॉर्म (नाम, वर्णनकर्ता) के जोड़े हैं, जहां नाम एक स्ट्रिंग और डिस्क्रिप्टर एक संपत्ति वर्णनकर्ता मान है।

हालांकि, मुझे ईसीएमए -262-3 में इसके लिए एक निश्चित विनिर्देश नहीं दिख रहा है। भले ही, मैं गैर-तारों को संपत्ति के नाम के रूप में उपयोग करने का प्रयास नहीं करूंगा।

10

किसी ऑब्जेक्ट में, नहीं, लेकिन मुझे Map इस एप्लिकेशन के लिए बेहद उपयोगी पाया गया है। यहां वह जगह है जहां मैंने इसे संख्यात्मक कुंजी, एक कुंजी-आधारित घटना के लिए उपयोग किया है।

onKeydown(e) { 
    const { toggleSidebar, next, previous } = this.props; 

    const keyMapping = new Map([ 
    [ 83, toggleSidebar ], // user presses the s button 
    [ 37, next   ], // user presses the right arrow 
    [ 39, previous  ] // user presses the left arrow 
    ]); 

    if (keyMapping.has(e.which)) { 
    e.preventDefault(); 
    keyMapping.get(e.which)(); 
    } 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^