इतने सारे जवाब आधे काम कर रहे हैं। हां, !!X
"X की सत्यता [एक बूलियन के रूप में प्रतिनिधित्व]" के रूप में पढ़ा जा सकता है। लेकिन !!
, व्यावहारिक रूप से बोलना, इतना महत्वपूर्ण नहीं है कि एक एकल चर है (या यहां तक कि अगर कई चर हैं) सत्य या झूठ है। !!myVar === true
बस के रूप में ही है myVar
। !!X
"वास्तविक" बूलियन की तुलना वास्तव में उपयोगी नहीं है।
आप जो हासिल करते हैं !!
वह एक दोहराए जाने वाले, मानकीकृत (और JSLint अनुकूल) फैशन में एक दूसरे के खिलाफ कई चर की सत्यता की जांच करने की क्षमता है ।
बस कास्टिंग :(
अर्थात्...
0 === false
है false
।
!!0 === false
है true
।
ऊपर का इतना उपयोगी नहीं है। if (!0)
आप के रूप में एक ही परिणाम देता है if (!!0 === false)
। मैं एक चर को बूलियन में डालने और फिर "सच्चे" बूलियन से तुलना करने के लिए एक अच्छे मामले के बारे में नहीं सोच सकता।
JSLint के निर्देशों से "== और! =" देखें (ध्यान दें: क्रॉकफ़ोर्ड अपनी साइट को थोड़ा आगे बढ़ा रहा है; कुछ पर मरने के लिए यह लिंक उत्तरदायी है):
तुलना करने से पहले == और = = ऑपरेटर प्रकार की ज़बरदस्ती करते हैं। यह बुरा है क्योंकि यह 't \ r \ n' == 0 को सत्य बनाता है। यह प्रकार की त्रुटियों को मुखौटा कर सकता है। JSLint मज़बूती से यह निर्धारित नहीं कर सकता है कि == का उपयोग सही ढंग से किया जा रहा है, इसलिए = = और! = का उपयोग नहीं करना सबसे अच्छा है और इसके बजाय हमेशा अधिक विश्वसनीय === और = = ऑपरेटरों का उपयोग करें।
यदि आप केवल इस बात का ध्यान रखते हैं कि मूल्य सत्य या मिथ्या है, तो संक्षिप्त रूप का उपयोग करें। के बजाय
(foo != 0)
सिर्फ कहे
(foo)
और के बजाय
(foo == 0)
कहते हैं
(!foo)
ध्यान दें कि कुछ अनूठे मामले हैं जहां एक नंबर के लिए एक बूलियन की तुलना में एक बूलियन को एक नंबर पर डाल दिया जाएगा ( true
को 1
और उसके बाद )। इस मामले में, मानसिक रूप से उपयोगी हो सकता है। हालांकि, फिर से, ये ऐसे मामले हैं जहां आप एक गैर-बूलियन की तुलना एक कठिन-टाइप बूलियन से कर रहे हैं, जो कि, एक गंभीर गलती है। अभी भी यहाँ जाने का रास्ता है।false
0
!!
if (-1)
╔═══════════════════════════════════════╦═══════════════════╦═══════════╗
║ Original ║ Equivalent ║ Result ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1 == true) console.log("spam") ║ if (-1 == 1) ║ undefined ║
║ if (-1 == false) console.log("spam") ║ if (-1 == 0) ║ undefined ║
║ Order doesn't matter... ║ ║ ║
║ if (true == -1) console.log("spam") ║ if (1 == -1) ║ undefined ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (!!-1 == true) console.log("spam") ║ if (true == true) ║ spam ║ better
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1) console.log("spam") ║ if (truthy) ║ spam ║ still best
╚═══════════════════════════════════════╩═══════════════════╩═══════════╝
और चीजें आपके इंजन के आधार पर भी चरमरा जाती हैं। उदाहरण के लिए, WScript, पुरस्कार जीतता है।
function test()
{
return (1 === 1);
}
WScript.echo(test());
वजह से कुछ ऐतिहासिक विंडोज जाइव , कि करेंगे उत्पादन -1 संदेश बॉक्स में! इसे cmd.exe प्रॉम्प्ट में आज़माएँ और देखें! लेकिन फिर WScript.echo(-1 == test())
भी आपको 0 या WScript की सुविधा मिलती है false
। दूर देखो। यह छुपा हुआ है।
सत्य की तुलना :)
लेकिन क्या होगा अगर मेरे पास दो मूल्य हैं जो मुझे समान ट्रूथी / फालसी-नेस के लिए जांचने की आवश्यकता है?
हमारे पास बहाना है myVar1 = 0;
और myVar2 = undefined;
।
myVar1 === myVar2
है 0 === undefined
और स्पष्ट रूप से गलत है।
!!myVar1 === !!myVar2
है !!0 === !!undefined
और सच है! एक ही सत्यता! (इस मामले में, दोनों "झूठेपन की सच्चाई है"।)
तो एकमात्र स्थान जिसे आपको वास्तव में "बूलियन-कास्ट वैरिएबल" का उपयोग करने की आवश्यकता होगी, यदि आपके पास ऐसी स्थिति है जहां आप जांच कर रहे हैं कि क्या दोनों चरों की सत्यता समान है , है ना? यही है, उपयोग करें !!
यदि आपको यह देखने की आवश्यकता है कि क्या दो संस्करण सत्य हैं या दोनों मिथ्या (या नहीं) हैं, अर्थात, समान (या नहीं) सत्यता ।
मैं उस अपमान के लिए एक महान, गैर-कंट्रास्टेड उपयोग के मामले के बारे में नहीं सोच सकता। हो सकता है कि आपके पास एक रूप में "लिंक" फ़ील्ड हैं?
if (!!customerInput.spouseName !== !!customerInput.spouseAge ) {
errorObjects.spouse = "Please either enter a valid name AND age "
+ "for your spouse or leave all spouse fields blank.";
}
तो अब अगर आपके पास पति या पत्नी दोनों के नाम के लिए सच्चाई है या उम्र और उम्र दोनों के लिए गलत है, तो आप जारी रख सकते हैं। अन्यथा आपको केवल एक फ़ील्ड मिला है जिसमें एक मान है (या बहुत जल्दी की गई शादी) और आपके errorObjects
संग्रह पर एक अतिरिक्त त्रुटि बनाने की आवश्यकता है ।
EDIT 24 अक्टूबर 2017, 6 फरवरी 19:
3 पार्टी पुस्तकालय जो स्पष्ट बूलियन मूल्यों की अपेक्षा करते हैं
यहां एक दिलचस्प मामला है ... !!
उपयोगी तब हो सकता है जब 3 पार्टी के कार्य स्पष्ट बूलियन मूल्यों की अपेक्षा करते हैं।
उदाहरण के लिए, जेएसएक्स (रिएक्ट) में गलत का एक विशेष अर्थ है जो सरल मिथ्या पर नहीं चलता है। यदि आपने अपने JSX में निम्नलिखित की तरह कुछ लौटाने की कोशिश की है, तो एक int की उम्मीद है messageCount
...
{messageCount && <div>You have messages!</div>}
... 0
जब आप शून्य संदेश देते हैं, तो रिएक्ट रेंडर देखकर आपको आश्चर्य हो सकता है । आपको स्पष्ट रूप से JSX को रेंडर न करने के लिए स्पष्ट रूप से वापस लौटना होगा। उपरोक्त कथन लौटाता है 0
, जिसे JSX खुशी से प्रस्तुत करता है, जैसा कि इसे करना चाहिए। यह नहीं बता सकता है कि आपके पास Count: {messageCount && <div>Get your count to zero!</div>}
(या कुछ कम वंचित) नहीं है।
एक फिक्स में बैंगबैंग शामिल है, जो इसमें समाहित 0
है !!0
, जो है false
:
{!!messageCount && <div>You have messages!</div>}
JSX के डॉक्स आपको अधिक स्पष्ट होने का सुझाव देते हैं, स्व-टिप्पणी कोड लिखते हैं, और एक बूलियन के लिए मजबूर करने के लिए तुलना का उपयोग करते हैं।
{messageCount > 0 && <div>You have messages!</div>}
मैं और अधिक आराम से अपने आप को एक त्रिगुट के साथ झूठा निपटने में सक्षम हूं -
{messageCount ? <div>You have messages!</div> : false}
टाइपस्क्रिप्ट में समान सौदा: यदि आपके पास एक फ़ंक्शन है जो एक बूलियन लौटाता है (या आप बूलियन चर के लिए एक मूल्य प्रदान कर रहे हैं), तो आप [आमतौर पर] एक बूलियन-वाई मान वापस नहीं कर सकते / असाइन नहीं कर सकते हैं; यह एक जोरदार टाइप बूलियन होना है। इसका मतलब है, अगर iff myObject
को जोरदार टाइप किया जाता है , तो return !myObject;
बूलियन को लौटाने वाले फ़ंक्शन के लिए काम करता है, लेकिन return myObject;
ऐसा नहीं करता है। आपको return !!myObject
टाइपस्क्रिप्ट की अपेक्षाओं से मेल खाना है।
टाइपस्क्रिप्ट के लिए अपवाद? यदि आप myObject
एक थे any
, तो आप जावास्क्रिप्ट वाइल्ड वेस्ट में वापस आ गए और इसे वापस कर सकते हैं !!
, भले ही आपका रिटर्न प्रकार एक बूलियन हो।
ध्यान रखें कि ये JSX और टाइपस्क्रिप्ट कन्वेंशन हैं , जावास्क्रिप्ट के लिए अंतर्निहित नहीं हैं ।
लेकिन अगर आपको 0
अपने रेंडर किए गए JSX में अजीब सा लगता है, तो ढीले झूठे प्रबंधन के बारे में सोचें।