क्यों && ऑपरेटर दूसरे संकार्य के प्रकार के उत्पादन करता है

वोट
24

के बारे में §4.15.6 में टाइपप्रति विनिर्देश राज्यों &&ऑपरेटर:

&& ऑपरेटर किसी भी प्रकार की होने की ऑपरेंड परमिट और एक का उत्पादन दूसरे संकार्य के रूप में एक ही प्रकार के परिणाम

जावास्क्रिप्ट में, &&ऑपरेटर पहले संकार्य रिटर्न अगर यह falsy है, अन्यथा यह दूसरा संकार्य रिटर्न ( ECMA-262 §11.11 देख )।

इसका मतलब है कि अगर बाईं संकार्य falsy है, &&कि बाईं संकार्य के प्रकार से मेल खाता है एक मूल्य वापस आ जाएगी। उदाहरण के लिए,

typeof ( false && {}      ) === boolean // true
typeof ( ''    && 1       ) === string  // true
typeof ( null  && hello ) === object  // true
typeof ( NaN   && true    ) === number  // true

टाइपप्रति, शासन ऊपर उद्धृत के अनुसार, होगा गलत तरीके से की भविष्यवाणी ऊपर भाव के प्रकार होने के लिए Object, Number, Stringऔर Boolean, क्रमशः।

क्या मैं कुछ भूल रहा हूँ? वहाँ एक के प्रकार बनाने के लिए एक अच्छा कारण है &&अभिव्यक्ति दूसरे संकार्य के प्रकार से मेल खाते हैं? परिणाम प्रकार की तरह व्यवहार करना चाहिए नहीं ||ऑपरेटर, और दो ऑपरेंड का सबसे अच्छा आम प्रकार लौटने के लिए, और Anyअगर कोई है सबसे अच्छा आम प्रकार?

02/10/2012 को 16:50
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
20

लंबी कहानी संक्षेप में, क्या यहां कोई समाधान नहीं है कि हर कोई प्रसन्न है।

इस आम मुहावरा पर विचार करें:

var customer = GetCustomer(...); // of type 'Customer'
var address = customer && customer.address;
if(address) {
    printAddressLabel(address); // Signature: (Address) => void
} else {
    // Couldn't find the customer or the customer has no address on file
}

यह हार और तय करते हैं कि 'पता' है करने के लिए बहुत लंगड़ा होगा 'कोई भी' ग्राहकों की और पता के बीच कोई सबसे अच्छा आम प्रकार है, क्योंकि वहाँ।

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

जबकि प्रकार सुरक्षा तकनीकी रूप से इस बिंदु पर टूट जाता है, यह तो एक तरीका है कि एक त्रुटि में परिणाम की संभावना है में नहीं कर रहा है। या तो आप truthiness के लिए परिणामी मूल्य का परीक्षण करने के (इस स्थिति में प्रकार कम या ज्यादा अप्रासंगिक है) जा रहे हैं, या आप किसी आपरेशन (दोनों कर ऊपर के उदाहरण) के लिए प्रकल्पित सही संकार्य उपयोग करने के लिए जा रहे हैं।

अगर हम उदाहरण आप सूचीबद्ध को देखो और नाटक बाईं संकार्य धुंधलेपन से truthy या falsy है और उसके बाद समझदार कोड है कि वापसी मान पर कार्य करते हैं लिखने की कोशिश है, यह एक बहुत स्पष्ट हो जाता है - वहाँ बस नहीं है जितना आप कर सकते हैं करते हैं 'गलत साथ && {} किसी भी 'तर्क स्थिति या truthiness परीक्षण' जो पहले से किसी में जा रहा नहीं है '।


परिशिष्ट

के बाद से कुछ लोगों को ऊपर से सहमत नहीं थे, यहाँ एक अलग व्याख्या दी गई है।

के एक पल कि टाइपप्रति प्रकार प्रणाली तीन नए प्रकार जोड़ा के लिए नाटक करते हैं: Truthy<T>, Falsy<T>, और Maybe<T>, प्रकार के संभावित truthy / falsy मूल्यों का प्रतिनिधित्व T। इन प्रकार के लिए नियम इस प्रकार हैं:

  1. Truthy<T> वास्तव में की तरह बर्ताव T
  2. आप में से किसी गुण उपयोग नहीं कर सकते Falsy<T>
  3. प्रकार का एक अभिव्यक्ति Maybe<T>है, जब एक में शर्त के रूप में इस्तेमाल किया ifब्लॉक, एक हो जाता है Truthy<T>कि एक ही के शरीर में ifब्लॉक और एक Falsy<T>में elseब्लॉक

यह आप इस जैसे कार्य करने देते हैं:

function fn(x: Maybe<Customer>) {
   if(x) {
      console.log(x.address); // OK
   } else {
      console.log(x.phone); // Error: x is definitely falsy
   }
   console.log(x.name); // Warning: x might be falsy!
}

काफ़ी अच्छा अब तक। अब हम पता लगा सकते हैं कि किस प्रकार नियमों && ऑपरेटर के लिए कर रहे हैं।

  • Truthy<T> && x एक त्रुटि होना चाहिए - अगर बाईं ओर truthy माना जाता है, तो आप सिर्फ लिखा जाना चाहिए था x
  • Falsy<T> && xएक त्रुटि होना चाहिए - अगर बाईं ओर falsy होने के लिए जाना जाता है, xनहीं पहुंचा जा सकता है कोड
  • Maybe<T> && x उत्पादन करना चाहिए ... क्या?

हम जानते हैं कि का परिणाम Maybe<T> && xप्रकार का एक falsy मूल्य या तो हो जाएगा T, या x। यह उत्पादन नहीं कर सकता Truthy<T>है (जब तक T== के प्रकार के xजो मामले में इस पूरे चर्चा विवादास्पद है)। चलो इस नए प्रकार कहते हैं Falsy<T> XOR Maybe<U>

के नियमों क्या चाहिए Falsy<T> XOR Maybe<U>हो सकता है?

  • जाहिर है, आप के गुणों का उपयोग नहीं कर सकते हैं Tउस पर। मान प्रकार का है, तो T, यह falsy, और उपयोग के लिए सुरक्षित नहीं है।
  • आप एक के रूप में उपयोग करने के लिए सक्षम होना चाहिए Maybe<U>, के बाद से Falsy<T>और Falsy<U>एक ही व्यवहार है
  • आप के गुणों का उपयोग करने में सक्षम नहीं होना चाहिए U, क्योंकि मूल्य अभी भी falsy हो सकता है।
  • आप एक में इसका इस्तेमाल करते हैं, तो ifपरीक्षण है, तो यह एक हो जाना चाहिए Truthy<U>कि ब्लॉक में ifबयान

दूसरे शब्दों में, Falsy<T> XOR Maybe<U> है Maybe<U> । यह सब एक ही नियमों का पालन करती। आप इस अजीब जोड़कर सभी यहाँ पर प्रकार प्रणाली को मुश्किल की जरूरत नहीं है XORक्योंकि एक प्रकार है कि सभी विनिर्देशों आप की जरूरत फिट बैठता है पहले से मौजूद है, टाइप।

यह किसी एक बॉक्स दे रही है और कह रही है "यह या तो कचरे के खाली बॉक्स, या पुनरावर्तनीय की एक पूरी बॉक्स है" की तरह एक सा है। आप सुरक्षित रूप से रीसाइक्लिंग बिन में बॉक्स की सामग्री खाली कर सकते हैं।

02/10/2012 को 17:55
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more