2011-12-20 18 views
8

क्यों जावास्क्रिप्ट किसी अन्य विकल्प पर एक String वापस जाने के लिए पसंद करते हैं करता है?वापसी स्ट्रिंग बनाम पूर्णांक बनाम अपरिभाषित अशक्त बनाम

निम्नलिखित टुकड़ा पर विचार करें।

var arr = ['Hello1', 'Hello2', 'Hello3']; 

Array.prototype.item = function(x) { 
    return this[x] || null || 'aïe' || 12 || undefined ; 
}; 

console.log(arr.item(43)); // returns aïe 

मैंने जानबूझकर एक अस्तित्वहीन सरणी तत्व कहा।

हालांकि मुझे समझ में नहीं आता कि arr.item(43)String क्यों देता है? क्यों नहीं null या undefined या यहाँ तक कि 12?

उत्तर

25

क्योंकि this[x]undefined है, जो झूठा है, और null है।

|| ऑपरेटर रिटर्न पहले "truthy" मान यह पाता है, और उस बिंदु पर मूल्यांकन के बंद हो जाता है।

यदि कोई "truthy" मान पाया जाता है, यह मूल्यांकन किया है पिछले संकार्य का परिणाम देता है।

6 "falsey" मूल्यों की कुल रहे हैं। वे हैं ...

  1. false
  2. undefined
  3. null
  4. ""
  5. NaN
  6. 0

सब कुछ और सच माना जाता है।

तो अपने अभिव्यक्ति के रूप में मूल्यांकन किया जाएगा ...

// v--falsey   v--truthy! return it! 
((((this[x] || null) || 'aïe') || 12) || undefined); 
//    ^--falsey   ^--------^---these are not evaluated at all 

या आप इस तरह इसे देख सकता है:

(
    (
    (
     (this[x] || null) // return null 
      /* (null */ || 'aïe') // return 'aïe' and stop evaluating 
           || 12) 
             || undefined); 
+1

चीयर्स! पूरी तरह से स्पष्ट :) – Pierre

+2

बस एक नाइटपिक, '||' अंतिम मूल्यांकन अभिव्यक्ति देता है। इस मामले में जब कोई * सच्चाई * है, तो वह उसे वापस कर देगा। – alex

+0

@alex: हम्म ... हाँ, लेकिन पहली "सत्य" अभिव्यक्ति * आखिरी मूल्यांकन है। शायद मैंने स्पष्ट रूप से पर्याप्त सर्किटिंग पर जोर नहीं दिया। मैं अपडेट करूंगा। –

1

स्ट्रिंग या के की श्रृंखला में पहली truthy मूल्य है। साधारण।

1

यह क्रम में मूल्यांकन कर रही है क्योंकि बाएं से दाएं।

आप इस के लिए संशोधित करने के लिए थे, तो:

return this[x] || null || 12 || 'aïe' || undefined ; 

आपका जवाब होगा 12.

3

कोड a || b मोटे तौर पर a ? a : b के बराबर है, या इस से थोड़ा अधिक वर्बोज़ कोड:

if (a) { 
    result = a; 
} else { 
    result = b; 
} 

|| के बाद से अभिव्यक्ति a || b || c(a || b) || c के रूप में मूल्यांकन किया जाता है left-associative है।


तो सरल शब्दों में इसका मतलब है कि || ऑपरेटर जब श्रृंखलित पहले संकार्य कि "truthy" है, वरना पिछले तत्व देता है।

var result = f() || g() || defaultValue; 

आप इस रूप में पढ़ सकता है: च का परिणाम हो जाओ()

यह सुविधा आपको लापता मान हैं जब चूक प्रदान करने के लिए उपयोगी हो सकता है। यदि यह एक झूठा मान है, तो जी() का प्रयास करें। यदि वह एक झूठा मूल्य भी देता है, तो defaultValue का उपयोग करें।

5

बयान

return this[x] || null || 'aïe' || 12 || undefined ; 

subexpressions बाएं से दाएं, और पहली उपसूचक कि झूठी का मूल्यांकन नहीं करता है वापस आ जाएगी का मूल्यांकन करेंगे। गैर-मौजूद तत्व झूठी का मूल्यांकन करता है क्योंकि यह अपरिभाषित है, और nullपरिभाषा के अनुसार है। इससे स्ट्रिंग को पहले गैर-झूठी सबएक्सप्रेस के रूप में छोड़ दिया जाता है, इसलिए आपको यही मिलता है।

0

return this[x] || null || 'aïe' || 12 || undefined उनमें से किसी एक को वापस नहीं करेगा। यह this[x] || null || 'aïe' || 12 || undefined अभिव्यक्ति के परिणाम को वापस करने वाला माना जाता है - मेरा मानना ​​है कि यह एक बुलियन मूल्य लौटाएगा।

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