जावास्क्रिप्ट - अपरिभाषित की संपत्ति सेट नहीं कर सकते


108

मेरा कोड:

var a = "1",
b = "hello",
c = { "100" : "some important data" },
d = {};

d[a]["greeting"] = b;
d[a]["data"] = c;

console.debug (d);

मुझे निम्नलिखित त्रुटि मिलती है:

अनक्रेड टाइप टाइप: अपरिभाषित की संपत्ति 'अभिवादन' को सेट नहीं कर सकता।

मैं एक सहयोगी सरणी के समान कुछ करने की कोशिश कर रहा हूं। यह काम क्यों नहीं कर रहा है?


1
d [a] अपरिभाषित है। संक्षेप में डी ["1"] अपरिभाषित है
जोसेफ मैरीकल

जवाबों:


159

आप कभी d[a]भी किसी मूल्य पर सेट नहीं होते हैं ।

इस वजह से, का d[a]मूल्यांकन करता है undefined, और आप संपत्तियों को सेट नहीं कर सकते undefined

अगर आप चीजों को d[a] = {}सही तरीके से जोड़ते हैं तो आपको d = {}उम्मीद के मुताबिक काम करना चाहिए।

वैकल्पिक रूप से, आप किसी ऑब्जेक्ट इनिलाइज़र का उपयोग कर सकते हैं:

d[a] = {
    greetings: b,
    data: c
};

या आप dएक अनाम फ़ंक्शन उदाहरण में सभी गुण सेट कर सकते हैं :

d = new function () {
    this[a] = {
        greetings: b,
        data: c
    };
};

यदि आप ऐसे वातावरण में हैं जो ES2015 सुविधाओं का समर्थन करता है, तो आप गणना की गई संपत्ति के नाम का उपयोग कर सकते हैं :

d = {
  [a]: {
    greetings: b,
    data: c
  }
};

यह काम करता है। पैटर्न होना चाहिए: d = {[a]: {अभिवादन: b, डेटा: c}}
robskrob

@robertjewell, अच्छा बिंदु, मैंने ES2015 नोटेशन के बारे में नोट को शामिल करने के लिए अपडेट किया है।
zzzzBov

अद्भुत व्याख्या।
फिजा खान

32

आपको d[a]या तो एक सहयोगी सरणी, या एक ऑब्जेक्ट पर सेट करना होगा:

  • d[a] = [];
  • d[a] = {};

सेटिंग के बिना, यह वही हो रहा है:

d[a] == undefined, इसलिए आप कर रहे हैं undefined['greeting']=b;और परिभाषा के अनुसार, अपरिभाषित का कोई गुण नहीं है। इस प्रकार, आपको प्राप्त त्रुटि।


arrayया object। जेएस के पास साहचर्य सरणियां नहीं हैं, हालांकि Objectसीमित उपयोगों के लिए एक जैसा काम कर सकता है।
जेरेमी जे स्टारचेर सेप

@JeremyJStarcher: जानने के लिए बिल्कुल सही और महत्वपूर्ण, लेकिन सोच के उस स्तर तक, जावास्क्रिप्ट में कोई सरणियाँ नहीं हैं; इसमें केवल ऑब्जेक्ट हैं
vol7ron

बिल्कुल नहीं। साहचर्य सरणियों के ऐसे पहलू हैं जो Javacript वस्तुओं के बारे में सच नहीं हैं जो कोडर्स की यात्रा कर सकते हैं। (ट्रू एसोसिएट अरेज़ की जरूरत होती है [स्ट्रिंग्स होने के लिए कुंजी की आवश्यकता द्वारा सीमित। विरासत में मिली पूर्वनिर्धारित गुणों की उपस्थिति एक और बड़ा अंतर है।) दूसरी ओर, जावास्क्रिप्ट सरणियाँ, जबकि ऑब्जेक्ट्स, एक की तरह कार्य करते हैं, एक संख्यात्मक सारणी की अपेक्षा करते हैं। एक कार्यक्षमता का एक पहलू है, जबकि दूसरा आंतरिक कार्यान्वयन है।
जेरेमी जे स्टारचर

6

संग्रहित वस्तु d[a]को किसी भी चीज़ पर सेट नहीं किया गया है। इस प्रकार, का d[a]मूल्यांकन करता है undefined। आप प्रॉपर्टी को undefined:) को असाइन नहीं कर सकते । आपको कोई ऑब्जेक्ट या एरे असाइन करना होगा d[a]:

d[a] = [];
d[a]["greeting"] = b;

console.debug(d);

2
किसी ऑब्जेक्ट को असाइन करने के लिए सबसे अच्छा: d[a] = {};- गैर-संख्यात्मक कुंजियों के साथ सरणियों का उपयोग करने से लाइन के नीचे समस्याएं पैदा होती हैं।
nnnnnn

5

जावास्क्रिप्ट में लगभग सब कुछ एक वस्तु है, nullऔर undefinedअपवाद हैं।

के उदाहरण Arrayएक वस्तु है। इसलिए आप एक सरणी की संपत्ति सेट कर सकते हैं, उसी कारण से, आप अपरिभाषित की संपत्ति सेट नहीं कर सकते, क्योंकि यह एक वस्तु नहीं है


3

मैं सिर्फ यह देखने के लिए एक साधारण जांच करूँगा कि क्या d [a] मौजूद है और यदि इसे प्रारंभ नहीं किया गया ...

var a = "1",
    b = "hello",
    c = { "100" : "some important data" },
    d = {};

    if (d[a] === undefined) {
        d[a] = {}
    };
    d[a]["greeting"] = b;
    d[a]["data"] = c;

    console.debug (d);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.