अगर एक बयान में बूलियन


144

आज मैंने कोड के बारे में एक टिप्पणी प्राप्त की है जिस तरह से मैं यह जांचता हूं कि एक स्कूल असाइनमेंट में एक चर सही है या गलत।

कोड जो मैंने लिखा था वह कुछ इस तरह था:

var booleanValue = true;

function someFunction(){
    if(booleanValue === true){
        return "something";
    }
}

उन्होंने कहा कि इसे इस तरह से लिखना बेहतर था / नहीं:

var booleanValue = true;

function someFunction(){
    if(booleanValue){
        return "something";
    }
}

"=== सच" भाग के बारे में मुझे जो टिप्पणी मिली है, वह यह थी कि इसकी आवश्यकता नहीं थी और भ्रम पैदा कर सकता था।

हालाँकि मेरा विचार यह है कि यह जाँचना बेहतर है कि चर एक बूलियन है या नहीं, खासकर जब से जावास्क्रिप्ट एक शिथिल भाषा है।

दूसरे उदाहरण में एक स्ट्रिंग भी "कुछ" लौटाएगा;

तो मेरा सवाल; क्या भविष्य में "=== सच" भाग को ढीला करना है, या चर के प्रकार की भी जाँच करना अच्छा है।

संपादित करें: मेरे "वास्तविक" कोड में बूलियन का प्रतिनिधित्व करता है कि क्या कोई छवि हटा दी गई है या नहीं, इसलिए केवल बूलवैल्यू का मान कभी भी सही या गलत होना चाहिए।

उदाहरण के लिए 0 और 1 उस चर में नहीं होना चाहिए।


4
यह पठनीय और अच्छा अभ्यास है ===
पियास डी

2
के लिए +1 === true। भ्रम से बचता है !!
गशू

1
@ वाशू [0] === trueझूठ का मूल्यांकन करता है।
रेस्टिंगरॉबोट

1
@Jlange यह नहीं होना चाहिए? कृपया समझाएं
गशू

मेरे कहने का मतलब यह है कि यदि आप केवल "सत्य" अस्तित्व की जांच करना चाहते हैं, तो यह कथन विफल हो जाएगा, भले ही उसे सही का मूल्यांकन करना चाहिए ([0] सही का मूल्यांकन करता है, लेकिन टाइप रूपांतरण के बिना नहीं)। यह वास्तव में इस बात पर निर्भर करता है कि आप अपने कथन को पूरा करने की कोशिश कर रहे हैं। उपयोग करें === trueजब आपको यह सुनिश्चित करने की आवश्यकता हो कि हालत बिल्कुल इसके बराबर है true
रेस्ट्रोबारोट

जवाबों:


222

सबसे पहले, तथ्यों:

if (booleanValue)

सहित , किसी भी गैर-शून्य संख्या, किसी भी गैर-रिक्त स्ट्रिंग मान, किसी भी ऑब्जेक्ट या सरणी, आदि ifके किसी भी सत्य मूल्य के लिए कथन को संतुष्ट करेगा ...booleanValuetrue

दूसरी ओर:

if (booleanValue === true)

यह केवल इस ifशर्त को पूरा करेगा यदि booleanValueइसके बराबर है true। कोई अन्य सत्य मूल्य इसे संतुष्ट नहीं करेगा।

दूसरी ओर यदि आप ऐसा करते हैं:

if (someVar == true)

फिर, जावास्क्रिप्ट क्या करेगा प्रकार trueके मिलान के लिए टाइप someVarकरें और फिर दो चर की तुलना करें। ऐसी बहुत सी स्थितियाँ हैं जहाँ यह संभव नहीं है कि कोई क्या करना चाहता है। इस वजह से, ज्यादातर मामलों में आप बचना चाहते हैं ==क्योंकि नियमों का काफी लंबा सेट है कि कैसे जावास्क्रिप्ट दो प्रकारों को एक ही प्रकार का होगा और जब तक आप उन सभी नियमों को नहीं समझेंगे और सब कुछ अनुमान लगा सकते हैं कि जेएस दुभाषिया कब हो सकता है दिए गए दो अलग-अलग प्रकार (जो अधिकांश JS डेवलपर्स नहीं कर सकते हैं), आप शायद ==पूरी तरह से बचना चाहते हैं ।

यह कितना भ्रमित हो सकता है इसका एक उदाहरण के रूप में:

var x;

x = 0;
console.log(x == true);   // false, as expected
console.log(x == false);  // true as expected

x = 1;
console.log(x == true);   // true, as expected
console.log(x == false);  // false as expected

x = 2;
console.log(x == true);   // false, ??
console.log(x == false);  // false 

मान के लिए 2, आपको लगता है कि 2यह एक सत्य मूल्य है, इसलिए यह अनुकूल रूप से तुलना करेगा true, लेकिन यह नहीं है कि कैसे प्रकार का काम करता है। यह दाहिने हाथ के मूल्य को बाएं हाथ के मूल्य से मिलान करने के trueलिए परिवर्तित कर रहा है इसलिए इसकी संख्या में परिवर्तित हो रहा है 1इसलिए यह तुलना 2 == 1कर रहा है जो निश्चित रूप से वह नहीं है जो आप चाहते हैं।

इसलिए, खरीदार सावधान रहें। यह ==लगभग सभी मामलों में बचने के लिए सबसे अच्छा है जब तक आप स्पष्ट रूप से उन प्रकारों को नहीं जानते हैं जिनकी आप तुलना करेंगे और जानते हैं कि सभी संभव प्रकार के जबरदस्ती एल्गोरिदम कैसे काम करते हैं।


तो, यह वास्तव में booleanValueआप के लिए अपेक्षित मूल्यों पर निर्भर करता है और आप कोड कैसे काम करना चाहते हैं। यदि आप पहले से जानते हैं कि यह केवल कभी एक trueया falseमूल्य होने वाला है, तो इसकी तुलना स्पष्ट रूप से करें

if (booleanValue === true)

सिर्फ अतिरिक्त कोड और अनावश्यक है

if (booleanValue)

अधिक कॉम्पैक्ट और यकीनन क्लीनर / बेहतर है।

यदि, दूसरी ओर, आप नहीं जानते कि क्या booleanValueहो सकता है और आप परीक्षण करना चाहते हैं कि क्या यह वास्तव में trueबिना किसी अन्य स्वचालित प्रकार के रूपांतरण के साथ सेट है , तो

if (booleanValue === true)

न केवल एक अच्छा विचार है, बल्कि आवश्यक है।


उदाहरण के लिए, यदि आप .on()jQuery के कार्यान्वयन को देखते हैं , तो इसका एक वैकल्पिक रिटर्न मान है। यदि कॉलबैक वापस आता है false, तो jQuery स्वतः ईवेंट के प्रचार को रोक देगा। इस विशिष्ट मामले में, के बाद से jQuery ही रोक प्रचार करता है, तो चाहता है falseवापस आ गया था, वे वापसी मान स्पष्ट रूप से के लिए जाँच === falseक्योंकि वे नहीं चाहते undefinedया 0या ""या कुछ और भी तुलना को पूरा करने के कि स्वचालित रूप से होगा टाइप-परिवर्तित गलत पर।

उदाहरण के लिए, यहां कॉलबैक कोड को संभालने वाला jQuery इवेंट है:

ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );

if ( ret !== undefined ) {
     event.result = ret;
     if ( ret === false ) {
         event.preventDefault();
         event.stopPropagation();
     }
 }

आप देख सकते हैं कि jQuery स्पष्ट रूप से खोज रहा है ret === false

लेकिन, jQuery कोड में कई अन्य स्थान भी होते हैं, जहाँ कोड की इच्छा को देखते हुए एक सरल जाँच उपयुक्त है। उदाहरण के लिए:

// The DOM ready check for Internet Explorer
function doScrollCheck() {
    if ( jQuery.isReady ) {
        return;
    }
    ...

मैं इस प्रश्न के बारे में कुछ समय से सोच रहा था, लेकिन किसी को भी पूछने का मौका नहीं मिला। यदि आप एक बार देख सकते हैं तो मैं सराहना करूँगा। stackoverflow.com/questions/32615466/…
mmm

यह उत्तर पूर्णतः सही नहीं है। गैर-शून्य संख्या के लिए 'x == सच' अभ्यस्त होना चाहिए।
तेमोह

@Teemoh - मैं आपकी टिप्पणी को नहीं समझता। Jsfiddle.net/jfriend00/89h8d8tm देखें ।
jfriend00

1
मैं सिर्फ यह कहना चाहता हूं कि 'if (x)' 'if (x == true)' जैसा नहीं है, जैसा आपने अपने उत्तर के पहले पैराग्राफ में लिखा था। will if (x) ’स्पष्ट रूप से its x’ को अपने बूलियन प्रतिनिधित्व में बदल देगा। 'if (x == true)' EcmaScript Abstract की तुलना Algorithm का उपयोग करेगा। आपने लिखा है कि 'अगर (x == सत्य)' किसी भी गैर-शून्य संख्या या गैर-रिक्त स्ट्रिंग या किसी भी वस्तु के लिए सही होगा। यह सिर्फ गलत है। अगर मैं आपके उदाहरण को 1 के बजाय 2 से चलाता हूं तो यह काम नहीं करेगा।
तेमोह

2
@ टिटहोम - मैं आपकी बात देखता हूं। उत्तर को सही किया गया और स्पष्ट किया गया और मैंने एक उदाहरण के साथ जबरदस्ती पर एक खंड जोड़ा, जिसमें दिखाया गया है कि यह कैसे अप्रत्याशित चीजें कर सकता है।
jfriend00

40

यदि आप लिखते हैं: if(x === true)यह केवल x = true के लिए सही होगा

यदि आप लिखते हैं: if(x)यह किसी भी x के लिए सही होगा जो नहीं है: '' (खाली स्ट्रिंग), गलत, अशक्त, अपरिभाषित, 0, NaN।


(खाली स्ट्रिंग), झूठा, अशक्त, अपरिभाषित, 0, NaN
ओलिबॉय 50

मत भूलना NaNऔर -0
हयकम

8

सादे में "अगर" चर एक बूलियन के लिए मजबूर किया जाएगा और यह ऑब्जेक्ट पर बूलियन का उपयोग करता है: -

    Argument Type   Result

    Undefined       false
    Null            false
    Boolean         The result equals the input argument (no conversion).
    Number          The result is false if the argument is +0, 0, or NaN;
                    otherwise the result is true.
    String          The result is false if the argument is the empty 
                    String (its length is zero); otherwise the result is true.
    Object          true.

लेकिन === के साथ तुलना में किसी भी प्रकार का ज़बरदस्ती नहीं है, इसलिए उन्हें बिना ज़बरदस्ती के बराबर होना चाहिए।

यदि आप कह रहे हैं कि ऑब्जेक्ट बूलियन भी नहीं हो सकता है, तो आपको केवल सच / झूठ से अधिक विचार करना पड़ सकता है।

if(x===true){
...
} else if(x===false){
....
} else {
....
}

5

यह आपके usecase पर निर्भर करता है। यह भी प्रकार की जाँच करने के लिए समझ में आ सकता है, लेकिन अगर यह सिर्फ एक झंडा है, तो यह नहीं है।


===तुलना प्रकार बलात्कार प्रदर्शन नहीं करता। तो ओपी कोड प्रभावी रूप से ध्वज के प्रकार का परीक्षण करता है। यह केवल तभी सफल होता है जब मूल्य एक बूलियन है और सच है।
जेसी हैलट

मुझे rephrase करते हैं। यदि आप जानते हैं कि यह सही है या गलत है, तो इससे कोई फर्क नहीं पड़ता।
वेन

5

सामान्य तौर पर, इसे साफ करने के लिए क्लीनर और सरल है === true

हालाँकि, जावास्क्रिप्ट में, वे कथन अलग हैं।

if (booleanValue)यदि निष्पादित करेंगे booleanValueहै truthy - के अलावा और कुछ 0, false, '', NaN, null, और undefined

if (booleanValue === true)booleanValueठीक से बराबर होने पर ही निष्पादित होगा true


जो ठीक वही है जो मैं सुनिश्चित करना चाहता हूं, तब भी जब मैं चाहता हूं कि केवल बूलवैल सही या गलत हो। चर कोड में कई बार सही / गलत पर सेट हो जाता है। मुझे पता है कि जब मैं कोड लिखता हूं, लेकिन अगर मैं एक साल बाद फिर से कोड की जांच करता हूं तो यह सिर्फ एक बड़ा सवालिया निशान है जब तक कि मैंने सब कुछ फिर से नहीं पढ़ा?
डिर्कजज़

@aldanux: उफ़; मेरा मतलब था ''
एसएलएसी

4

पहचान (===)ऑपरेटर समान रूप से समानता (==)ऑपरेटर के लिए व्यवहार करता है, जैसे कि कोई भी प्रकार का रूपांतरण नहीं किया जाता है, और प्रकार को समान माना जाना चाहिए।


आपका अंतिम वाक्य गलत है। अपने दो वक्तव्यों की कोशिश करो if (booleanValue)और if (booleanValue==true)जब booleanValueहै 2। वे दो कथन आपको एक ही परिणाम नहीं देते हैं।
jfriend00

दिलचस्प। इसके लिए मुझे आप के शब्दों पर भरोसा है। मैं ओबीजसी / सी / सी ++ दुनिया में सोच रहा था, जेएस में मैं आपको सही मान रहा हूं, क्योंकि जेएस में डेटा प्रकारों को बदला जा सकता है और 2 == सच अगर तब मात्रा निर्धारित नहीं करेगा।
अपोलो सॉफ्टवेयर

1
इस विशिष्ट उदाहरण के लिए मेरा जवाब ऊपर देखें। विभिन्न प्रकारों के दो मूल्यों की तुलना करने के लिए जावास्क्रिप्ट को स्वचालित प्रकार रूपांतरण कैसे करना है, इसके साथ यह करना है।
१६

3

चूंकि चेक किया गया मान है, Booleanइसलिए इसे कम कोडिंग के लिए सीधे उपयोग करने के लिए पसंद किया जाता है और सभी ने ऐसा ही किया==true


2

चूँकि आपने पहले ही स्पष्ट रूप से बूल के रूप में इनिशियलाइज़ किया है, मुझे लगता है कि ===ऑपरेटर की आवश्यकता नहीं है।


2

यदि चर केवल बूलियन मूल्यों पर कभी भी ले जा सकता है, तो यह छोटे वाक्यविन्यास का उपयोग करने के लिए उचित है।

यह संभावित रूप से अन्य प्रकार सौंपा जा सकता है, और आप को अलग करने की जरूरत है trueसे 1या "foo", तो आप का उपयोग करना चाहिए === true


2

मुझे लगता है कि आपका तर्क ध्वनि है। लेकिन व्यवहार में मैंने पाया है कि ===तुलना को छोड़ना कहीं अधिक सामान्य है । मुझे लगता है कि इसके तीन कारण हैं:

  1. यह आमतौर पर अभिव्यक्ति के अर्थ में नहीं जुड़ता है - यह उन मामलों में है जहां मूल्य वैसे भी बूलियन के रूप में जाना जाता है।
  2. क्योंकि जावास्क्रिप्ट में बहुत प्रकार की अनिश्चितता है, एक प्रकार का चेक मजबूर करता है जब आप एक अप्रत्याशित undefinedया nullमूल्य प्राप्त करते हैं । अक्सर आप चाहते हैं कि आपका परीक्षण ऐसे मामलों में विफल हो। (हालांकि मैं इस दृश्य को "विफल तेज़" आदर्श वाक्य के साथ संतुलित करने की कोशिश करता हूं)।
  3. जावास्क्रिप्ट प्रोग्रामर तेजी से और ढीले प्रकार के साथ खेलना पसंद करते हैं - विशेष रूप से बूलियन अभिव्यक्तियों में - क्योंकि हम कर सकते हैं।

इस उदाहरण पर विचार करें:

var someString = getInput();
var normalized = someString && trim(someString);  
// trim() removes leading and trailing whitespace

if (normalized) {
    submitInput(normalized);
}

मुझे लगता है कि इस तरह का कोड असामान्य नहीं है। यह ऐसे मामलों में जहां संभालती getInput()रिटर्न undefined, nullया एक खाली स्ट्रिंग। दो बूलियन मूल्यांकन के submitInput()कारण ही कहा जाता है यदि दिए गए इनपुट एक स्ट्रिंग है जिसमें गैर-व्हाट्सएप वर्ण होते हैं।

जावास्क्रिप्ट में &&अपना पहला तर्क लौटाता है यदि वह गलत है या उसका दूसरा तर्क है यदि पहला तर्क सत्य है; यदि ऐसा normalizedनहीं किया जाएगा undefinedतो someStringवह अपरिभाषित और आगे होगा। इसका मतलब है कि ऊपर बूलियन अभिव्यक्तियों के लिए कोई भी इनपुट वास्तव में बूलियन मूल्य नहीं हैं।

मुझे पता है कि बहुत सारे प्रोग्रामर जो इस तरह कोड को देखते समय मजबूत टाइप-चेकिंग क्रैग के आदी हैं। लेकिन ध्यान दें कि मजबूत टाइपिंग को लागू करने के लिए nullया undefinedमानों के लिए स्पष्ट जांच की आवश्यकता होगी , जो कोड को अव्यवस्थित करेगा। जावास्क्रिप्ट में जिसकी जरूरत नहीं है।


1

यह निर्भर करता है। यदि आप चिंतित हैं कि आपका वैरिएबल कुछ के रूप में समाप्त हो सकता है जो TRUE का समाधान करता है। फिर हार्ड चेकिंग एक जरूरी है। अन्यथा यह आपके ऊपर है। हालांकि, मुझे संदेह है कि वाक्यविन्यास whatever == TRUEकभी भी किसी को भी भ्रमित करेगा जो जानता था कि वे क्या कर रहे थे।


1

जावास्क्रिप्ट में बूलियन का विचार काफी अस्पष्ट है। इस पर विचार करो:

 var bool = 0 
 if(bool){..} //evaluates to false

 if(//uninitialized var) //evaluates to false

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



1

इसके अलावा बूलियन ऑब्जेक्ट के साथ परीक्षण किया जा सकता है, यदि आपको किसी ऑब्जेक्ट का परीक्षण करने की आवश्यकता है error={Boolean(errors.email)}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.