डबल पाइप ऑपरेटर ( ||
) क्या है?
डबल पाइप ऑपरेटर ( ||
) तार्किक OR
ऑपरेटर है । में सबसे अधिक भाषाओं यह निम्नलिखित तरीके से काम करता है:
- यदि पहला मान है
false
, तो यह दूसरा मान जाँचता है। यदि यह है true
, तो यह लौटता है true
और यदि यह है false
, तो यह वापस आ जाता है false
।
- यदि पहला मान है
true
, तो यह हमेशा लौटता है true
, चाहे दूसरा मूल्य कोई भी हो।
तो मूल रूप से यह इस तरह काम करता है:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
यदि आप अभी भी नहीं समझे हैं, तो इस तालिका को देखें:
| true false
------+---------------
true | true true
false | true false
दूसरे शब्दों में, यह केवल तभी गलत है जब दोनों मूल्य झूठे हैं।
यह जावास्क्रिप्ट में कैसे भिन्न है?
जावास्क्रिप्ट थोड़ा अलग है, क्योंकि यह एक शिथिल टाइप की भाषा है । इस मामले में इसका मतलब है कि आप ||
ऑपरेटर का उपयोग उन मूल्यों के साथ कर सकते हैं जो बूलियन नहीं हैं। हालांकि इसका कोई मतलब नहीं है, आप इस ऑपरेटर को उदाहरण के लिए एक फ़ंक्शन और ऑब्जेक्ट के साथ उपयोग कर सकते हैं:
(function(){}) || {}
वहां क्या होता है?
यदि मान बूलियन नहीं हैं, तो जावास्क्रिप्ट बूलियन में निहित रूपांतरण बनाता है । इसका मतलब है कि अगर मूल्य falsey है (उदाहरण के लिए 0
, ""
, null
, undefined
(यह भी देखें जावास्क्रिप्ट के सभी falsey मूल्यों , यह माना जाएगा)) false
; अन्यथा यह माना जाता है true
।
तो उपरोक्त उदाहरण देना चाहिए true
, क्योंकि खाली कार्य सत्य है। खैर, यह नहीं है। यह खाली फ़ंक्शन देता है। ऐसा इसलिए है क्योंकि जावास्क्रिप्ट ||
ऑपरेटर काम नहीं करता है जैसा कि मैंने शुरुआत में लिखा था। यह निम्नलिखित तरीके से काम करता है:
- यदि पहला मान गलत है , तो यह दूसरा मान लौटाता है ।
- यदि पहला मान सत्य है , तो यह पहला मान लौटाता है ।
आश्चर्य चकित? वास्तव में, यह पारंपरिक ||
ऑपरेटर के साथ "संगत" है । यह निम्नलिखित समारोह के रूप में लिखा जा सकता है:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
यदि आप एक सत्य मान को पास करते हैं x
, तो यह लौटाता है x
, अर्थात एक सत्य मूल्य। इसलिए यदि आप इसे बाद में if
खंड में उपयोग करते हैं :
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
आपको मिलता है "Either x or y is truthy."
।
अगर x
झूठी होती, eitherXorY
होती y
। इस मामले में आप "Either x or y is truthy."
अगर y
सच होता; अन्यथा आप प्राप्त करेंगे "Neither x nor y is truthy"
।
वास्तविक सवाल
अब, जब आप जानते हैं कि ||
ऑपरेटर कैसे काम करता है, तो आप संभवतः अपने आप से बाहर कर सकते हैं कि x = x || y
इसका क्या मतलब है। यदि x
सत्य है, x
को सौंपा गया है x
, तो वास्तव में कुछ भी नहीं होता है; अन्यथा y
सौंपा गया है x
। यह आमतौर पर कार्यों में डिफ़ॉल्ट मापदंडों को परिभाषित करने के लिए उपयोग किया जाता है। हालांकि, इसे अक्सर एक बुरा प्रोग्रामिंग अभ्यास माना जाता है , क्योंकि यह आपको एक पैरामीटर के रूप में एक गलत मूल्य (जो जरूरी नहीं है undefined
या null
) पारित करने से रोकता है । निम्नलिखित उदाहरण पर विचार करें:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
यह पहली नजर में वैध लगता है। हालाँकि, अगर आप पैरामीटर के false
रूप में पास हुए हैं तो क्या होगा flagA
(चूंकि यह बूलियन है, यानी हो सकता है true
या false
)? यह बन जाएगा true
। इस उदाहरण में, सेट flagA
करने का कोई तरीका नहीं है false
।
यह स्पष्ट रूप से जांचना बेहतर होगा कि क्या flagA
है undefined
, जैसे:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
हालांकि यह लंबा है, यह हमेशा काम करता है और इसे समझना आसान है।
आप डिफ़ॉल्ट फ़ंक्शन मापदंडों के लिए ES6 सिंटैक्स का भी उपयोग कर सकते हैं , लेकिन ध्यान दें कि यह पुराने ब्राउज़रों (जैसे IE) में काम नहीं करता है। आप इन ब्राउज़र का समर्थन करना चाहते हैं, तो आप के साथ अपने कोड transpile चाहिए कोलाहल ।
एमडीएन पर लॉजिकल ऑपरेटर्स भी देखें ।
falsy
, केवल नहीं हैundefined
। जितनी बार मैंने देखा हैdoWeDoIt = doWeDoIt || true
, मुझे रोने के लिए पर्याप्त है। (यानीdoWeDoIt
अब कभी नहीं होगाfalse
)