2013-06-22 5 views
5

Coffeescript निर्धारित करने के लिए जब एक चर मौजूद अस्तित्व ऑपरेटर का उपयोग करता है, और coffeescript documentation में यह पता चलता है कि something?something !== undefined && something !== null को संकलित हैं लेकिन मैंने देखा है कि coffeescript की मेरी संस्करण केवल something !== null को यह संकलन किया गया था तो मैं एक परीक्षण लिखा था कि यह कैसे होगा देखने के लिए मेरी कोडकॉफीस्क्रिप्ट का अस्तित्व ऑपरेटर कैसे काम करता है?

taco = undefined 

if taco? 
    console.log "fiesta!" 
else 
    console.log "No taco!" 

जो

// Generated by CoffeeScript 1.4.0 
(function() { 
    var taco; 

    taco = void 0; 

    if (taco != null) { 
    console.log("fiesta!"); 
    } else { 
    console.log("No taco!"); 
    } 

}).call(this); 

को संकलित और outputted कुछ हद तक अप्रत्याशित No taco! तो मेरे सवाल का दो गुना है प्रभावित करते हैं। कॉफ़ीस्क्रिप्ट अब undefined के मान की जांच क्यों नहीं करता है और यह क्यों सुखद है?

+0

कोई सटीक प्रश्न डुप्लिकेट नहीं है, लेकिन उत्तर वही है: http://stackoverflow.com/questions/9990117/existential-operator-and-object-properties: D – epidemian

उत्तर

21

प्रलेखन का कहना है इस बारे में ?:

CoffeeScript के अस्तित्व ऑपरेटर ? सच रिटर्न जब तक एक चर अशक्त या अपरिभाषित है, जो यह अनुरूप करने के लिए बनाता है रूबी के nil?

तो कोर्स यह कहेंगे "नो टैको!":

taco = undefined 
if taco? 
    console.log "fiesta!" 
else 
    console.log "No taco!" 

आपका taco स्पष्ट रूप से undefined है इसलिए taco? गलत है।

कॉफीस्क्रिप्ट स्पष्ट रूप से चर घोषित करता है ताकि ? का जावास्क्रिप्ट फॉर्म संदर्भ निर्भर हो। उदाहरण के लिए, अगर आप सिर्फ केवल यह कहना:

if taco? 
    console.log "fiesta!" 
else 
    console.log "No taco!" 

आप देखेंगे कि taco?typeof taco !== "undefined" && taco !== null हो जाता है। आप अभी भी "null" चेक (एक कड़े फॉर्म में) देखते हैं, लेकिन वहां भी है "var taco" typeof के साथ जांचें; ध्यान दें कि typeof taco परीक्षण taco = undefined के लिए भी जांच करता है, इसलिए एक कठोर !== परीक्षण का उपयोग यह देखने के लिए किया जा सकता है कि taconull है।

आप इस कहते हैं:

मैंने देखा है कि coffeescript की मेरी संस्करण केवल something !== null

को यह संकलन किया गया था लेकिन यह है कि यह क्या कर रहा है, यह वास्तव में something != null संकलन है नहीं है; सख्त असमानता (!==) बनाम असमानता (!=) को परिवर्तित करने वाले "मैला" प्रकार के उपयोग को नोट करें, जिसका दावा है कि आप वहां हैं।!= और !== के बीच का अंतर यहां महत्वपूर्ण है since:

  • अशक्त और अपरिभाषित प्रकार == (लेकिन ===)

तो कर रहे हैं यदि आप जानते हैं कि चर v घोषित किया गया है (यानी var v कहीं भी है) तो v != null यह जांचने के लिए पर्याप्त है कि v न तो null और न ही undefined है। हालांकि, अगर आपको नहीं पता कि v घोषित किया गया है, तो आपको null के साथ एक अविकसित चर की तुलना करने का प्रयास करते समय संदर्भ त्रुटि से बचने के लिए typeof चेक की आवश्यकता है। इस जावास्क्रिप्ट पर विचार करें:

if(taco != null) { 
    console.log("fiesta!"); 
} else { 
    console.log("No taco!"); 
} 

कि taco के बाद से अपने चेहरे पर एक ReferenceError फेंक जाएगा मौजूद नहीं है। यह:

if(typeof taco !== "undefined" && taco !== null) 
    console.log("fiesta!"); 
} else { 
    console.log("No taco!"); 
} 
दूसरी ओर

कुछ किया है कि घोषित नहीं किया गया पर पहुँचने का प्रयास के खिलाफ typeof जांच गार्ड के बाद से ठीक है। मुझे नहीं लगता कि आप बैकटिक्स का उपयोग कर जावास्क्रिप्ट को एम्बेड किए बिना कॉफीस्क्रिप्ट में पहला निर्माण कर सकते हैं।

+1

ग्रेट उत्तर। मेरी इच्छा है कि सवाल लेबल किया गया था, "कॉफीस्क्रिप्ट में, मौजूदा ऑपरेटर कैसे काम करता है?" तो आपका जवाब ढूंढना आसान था। इसके बजाय मुझे सवाल को पसंदीदा करना है ताकि मैं इसे फिर से ढूंढ सकूं। –

+3

जैसे ही मैंने देखा "नो टैको!" - वह मनोरंजक था। – jcollum

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