2013-11-29 8 views
9

निम्नलिखित टाइपप्रति:टाइपस्क्रिप्ट में Enums: जावास्क्रिप्ट कोड क्या कर रहा है?

enum PrimaryColors { Red, Green, Blue }; 

निम्न JavaScript का उत्पादन:

var PrimaryColors; 
(function (PrimaryColors) { 
    PrimaryColors[PrimaryColors["Red"] = 0] = "Red"; 
    PrimaryColors[PrimaryColors["Green"] = 1] = "Green"; 
    PrimaryColors[PrimaryColors["Blue"] = 2] = "Blue"; 
})(PrimaryColors || (PrimaryColors = {})); 
; 

मैं स्वीकार करने के लिए है कि मुझे समझ नहीं आता क्या जावास्क्रिप्ट कर रहा है शर्मिंदा हूँ।
ब्रांड्स में फ़ंक्शन इंडेक्स/कुंजी के रूप में किसी अन्य असाइनमेंट का उपयोग करके स्ट्रिंग मान असाइन कर रहा है। मैंने पहले ऐसा कुछ नहीं देखा है।
और फ़ंक्शन के बाद (प्राथमिक रंग || (प्राथमिक रंग = {}) का उद्देश्य क्या है?
यदि उत्तर जावास्क्रिप्ट को सही तरीके से सीखना है, तो मैं इसे आसानी से स्वीकार करूँगा, बशर्ते यह एक सुझाए गए स्रोत के साथ आता है जो स्पष्ट रूप से समझाता है । क्या मैं यहाँ देख रहा हूँ

उत्तर

9

मेरा मानना ​​है कि:

PrimaryColors[PrimaryColors["Red"] = 0] = "Red"; 

बराबर है करने के लिए:।

PrimaryColors[0] = "Red"; 
PrimaryColors["Red"] = 0; 

इस reference देखें

अभिव्यक्ति x = 7 पहले प्रकार का एक उदाहरण है। यह अभिव्यक्ति वैरिएबल एक्स को मान सात असाइन करने के लिए = ऑपरेटर का उपयोग करती है। अभिव्यक्ति स्वयं सात का मूल्यांकन करती है।

उदाहरण के लिए:

console.log((x = 7)); 

आउटपुट:

7 

इसी तरह:

var x = {}; 
console.log((x["hi"] = 7)); 

इसके अलावा आउटपुट 7.


दूसरी बात के लिए, PrimaryColors प्रारंभ में अनिर्धारित है।

var x; 
console.log(x); // undefined 

एक बूलियन संदर्भ में, undefinedfalse का मूल्यांकन:

console.log(!undefined); // true 
console.log(!!undefined); // false 

मानसिक स्वास्थ्य की जांच:

console.log((!undefined) === true); // true 
console.log((!!undefined) === false); // true 
console.log(undefined === false); // false 

इस लघु सर्किटिंग के एक आम उपयोग है। क्योंकि PrimaryColors प्रारंभ में अनिर्धारित (गलत) है, यह फ़ंक्शन में {} पास करेगा।

PrimaryColors || (PrimaryColors = {}) 
+0

"..., यह समारोह में {} पास होगा।" होना चाहिए: "..., इसे एक खाली वस्तु के रूप में प्रारंभिक रूप से प्रारंभ किया जाएगा, जिसे फ़ंक्शन में तब पारित किया जाएगा। –

7

शायद इससे मदद मिलेगी।

(function() {})(); 

यह एक 'तुरंत निष्पादन कार्य' है। यह एक फ़ंक्शन को अभिव्यक्ति के रूप में परिभाषित करता है, और फिर उसे आमंत्रित करता है।

var x = y || y = {}; 

यदि किसी डिफ़ॉल्ट मान को प्रारंभ करने के लिए कोई सामान्य पैटर्न है। यदि आपके पास कोई मान नहीं है, तो कथन का पहला भाग गलत है, इसलिए यह दूसरे भाग को निष्पादित करता है, जो y को मान निर्दिष्ट करता है। उस दूसरी अभिव्यक्ति का मूल्य y का नया मान है। तो एक्स वाई का मान बन जाता है - जो नया मान है यदि यह पहले से परिभाषित नहीं किया गया था।

x[y] = z; 

जेएस में ऑब्जेक्ट्स सहयोगी सरणी हैं। दूसरे शब्दों में, स्ट्रिंग-ऑब्जेक्ट जोड़े, जैसे IDictionary (स्ट्रिंग, ऑब्जेक्ट)। यह अभिव्यक्ति कुंजी y के साथ कुंजी को z के मान में सेट कर रही है, शब्दकोश एक्स में;

x[x["a"] = 0] = "a"; 

तो, एक ही बात यहाँ है, लेकिन एक नेस्टेड अभिव्यक्ति है, जो के साथ:

x["a"] = 0; 

तो है कि बस कुंजी "एक" का मूल्य निर्धारित करता है। कुछ भी आकर्षक नहीं। लेकिन यह भी एक अभिव्यक्ति है, जिसका मूल्य 0. तो स्थानापन्न है कि मूल अभिव्यक्ति में:

x[0] = "a"; 

कुंजी, तार होने की जरूरत है, तो यह वास्तव में के रूप में ही बात है:

x["0"] = "a"; 

कौन सा बस शब्दकोश में अभी तक एक और कुंजी सेट करता है। परिणाम है कि इन विवरण सत्य है:

x["0"] === "a"; 
x["a"] === 0; 
0

मैं इस सवाल पाया क्योंकि मैं क्यों सब पर एक Iife का उपयोग करते हैं तो आप सिर्फ सही बंद {} साथ वर init कर सकते हैं सोच रहा था। पिछले उत्तरों में इसे शामिल नहीं किया गया है, लेकिन मुझे अपना जवाब TypeScript Deep Dive में मिला है।

बात यह है कि, enums को कई फ़ाइलों में विभाजित किया जा सकता है। तुम बस स्पष्ट रूप से दूसरा, तीसरा, आदि enums के पहले सदस्य प्रारंभ करने में है, इसलिए यह: यह करने के लिए

enum Colors { 
    Red, 
    Green, 
    Blue 
} 

enum Colors { 
    Cyan = 3, 
    Magenta, 
    Lime 
} 

transpiles:

var Colors; 
(function (Colors) { 
    Colors[Colors["Red"] = 0] = "Red"; 
    Colors[Colors["Green"] = 1] = "Green"; 
    Colors[Colors["Blue"] = 2] = "Blue"; 
})(Colors || (Colors = {})); 
var Colors; 
(function (Colors) { 
    Colors[Colors["Cyan"] = 3] = "Cyan"; 
    Colors[Colors["Magenta"] = 4] = "Magenta"; 
    Colors[Colors["Lime"] = 5] = "Lime"; 
})(Colors || (Colors = {})); 

आप शायद जानते हैं, एक ही भीतर एक चर redeclaring दायरा हानिरहित है, लेकिन पुनर्नवीनीकरण नहीं है।

मुझे लगता है कि वे शायद बस जा सकते हैं:

var Colors; 
Colors || (Colors = {}); 
Colors[Colors["Cyan"] = 3] = "Cyan"; 
// ... 

और बंद को छोड़, लेकिन शायद मैं अभी भी कुछ याद कर रहा हूँ।

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