var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
var b
को सेट किया जाएगा true
।
क्या यह एक परिभाषित व्यवहार है जिस पर भरोसा किया जा सकता है?
जैसा कि ऊपर उत्तर दिया, हाँ , कि एक खाली स्ट्रिंग की परिभाषित व्यवहार है एक सशर्त में (एक if
अभिव्यक्ति, ||
, &&
, ? :
, ...)। ( मानक कहते हैं कि आंतरिक ट्यूलियन ऑपरेशन को लागू किया जाना चाहिए।)
मूल्यांकन अलग है जब खाली स्ट्रिंग का उपयोग तुलना ( सत्य, समानता और जावास्क्रिप्ट देखें ) में किया जाता है, भले ही परिणाम ज्यादातर समान हों :
// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length => false
// comparisons
console.log('' == true); // +0 === 1 => false
console.log('' == false); // +0 === +0 => true
console.log('' === true); // different types => false
console.log('' === false); // different types => false
स्पष्टीकरण: अनिवार्य रूप से, की ऑपरेंड जब ==
विभिन्न प्रकार है, जावास्क्रिप्ट कठिन उन्हें, उनके के अनुसार नंबर में बदलने की कोशिश करता है मूल्य , ( का उपयोग कर संचालन मानक कॉल ToNumber और ToPrimitive ), और फिर वह आंतरिक रूप से लागू होता है ===
। लेकिन जब आप ===
सीधे उपयोग करते हैं, तो प्रकार परिवर्तित नहीं होते हैं, इसलिए एक स्ट्रिंग की बूलियन से तुलना करना हमेशा होता है false
।
मोटे तौर पर, परिभाषित, गैर-शून्य, गैर-शून्य, गैर-रिक्त, गैर-झूठी मान (एक रिक्त स्ट्रिंग है ... खाली, संख्या -0 या +0 के लिए जावास्क्रिप्ट सशर्त ( टोबूलियन ) परीक्षण ... शून्य, NaN एक निर्धारित संख्या नहीं है, लेकिन एक खाली वस्तु वास्तव में खाली नहीं जाहिरा तौर पर है), या मुझे लगता है कि चाहते रूप में, सशर्त, के लिए परीक्षण एक (सही) बात है, जबकि तुलना स्पष्ट, ध्यान से परिवर्तित मूल्यों ( ToPrimitive , ToNumber ) की इसके ऑपरेंड, और के लिए दिखता सटीक समानता ।==
===
if (X) {} // is X a (true) thing?
if (X == Y) {} // are the values of X and Y same-ish?
if (X === Y) {} // are X and Y exactly the same?
सत्य, समानता और जावास्क्रिप्ट में और अधिक उदाहरण हैं जहां यह अंतर वास्तव में मायने रखता है, उदाहरण के '0'
लिए true
एक सशर्त (गैर-शून्य लंबाई, या, यह एक बात है ), लेकिन false
एक ==
तुलना में ( मान शून्य है)। '1'
फिर से, true
दोनों मामलों में है (यह एक चीज़ है और एक गैर-शून्य मान है)।
console.log('' ? true : false); // zero length => false
console.log('' == true); // +0 === 1 => false
console.log('0' ? true : false); // non-zero length => true
console.log('0' == true); // +0 === 1 => false
console.log('1' ? true : false); // non-zero length => true
console.log('1' == true); // 1 === 1 => true
false
यहां आ रहा हूं : jsfiddle.net/8CKbd