जावास्क्रिप्ट में, बूलियन के रूप में एक खाली स्ट्रिंग हमेशा झूठी होती है?


134

जावास्क्रिप्ट में,

var a = '';
var b = (a) ? true : false;

var bके लिए सेट किया जाएगा false

क्या यह एक परिभाषित व्यवहार है जिस पर भरोसा किया जा सकता है?


क्या आपको यकीन है, मैं falseयहां आ रहा हूं : jsfiddle.net/8CKbd
aubhava

मैंने इसे एक कदम आगे बढ़ाया। रिक्त स्थान के साथ स्ट्रिंग सही है। if ('') {कंसोल.लॉग ('!)} पर' '== 0 सत्य है।
अज़ात

2
मुझे लगता है कि @JonH संस्करण गलत है, रिक्त स्ट्रिंग ''एक बूलियन संदर्भ में गलत पर मूल्यांकन किया जाता है, इसलिए यदि a = '';उसके बाद a ? false : true=> '' ? false : true=> false ? false : true=> true(क्योंकि एक झूठे मूल्य के लिए मूल्यांकन है)। मुझे लगता है कि यह var b = (a) ? true : false;अगले बयान के साथ सही होना चाहिए ।
फोनिक्स

@PhoneixS ने संपादित किया, आशा है कि अब यह अधिक सार्थक है।
स्विसकोडर

1
@SwissCoder यह ऐसा नहीं था जो पठनीय नहीं है लेकिन यह एक और जवाब देता है। अब मैंने इसे ठीक कर लिया है।
फोनिक्स

जवाबों:


191

हाँ। जावास्क्रिप्ट ECMAScript की एक बोली है, और ECMAScript भाषा विनिर्देश स्पष्ट रूप से इस व्यवहार को परिभाषित करता है:

ToBoolean

परिणाम गलत है यदि तर्क खाली स्ट्रिंग है (इसकी लंबाई शून्य है); अन्यथा परिणाम सत्य है

Http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf से लिया गया उद्धरण


Aaaaand यह बस गया है
एंथनी

28
एक चेतावनी यह है कि new String("")सत्य है! ऐसा इसलिए है क्योंकि यह एक वस्तु है, जबकि लघु रूप ""आदिम मूल्य संस्करण का प्रतिनिधित्व करता है। वही चला जाता है new Number(0)और भी new Boolean(false)। यह आपके कोड में ऑब्जेक्ट संस्करणों का उपयोग नहीं करने का एक अच्छा कारण है, और इसका मतलब यह है कि if (str.length)इस किनारे के मामले को संभालता है जबकि if (str)ऐसा नहीं होगा।
क्रिस मिडलटन

54

हाँ। सभी false, 0, रिक्त स्ट्रिंग ''और "", NaN, undefined, और nullहमेशा की तरह मूल्यांकन किया जाता है false; सब कुछ है true

और आपके उदाहरण में, बी falseमूल्यांकन के बाद है। (मुझे लगता है कि आपने गलती से लिखा है true)


2
nullहै false, न trueतो nullहै , न है nulljsfiddle.net/sq1Lkpg0
ब्रूनो फिंगर

7
@Bruno, आप के साथ NaNऔर एक ही परीक्षण कर सकते हैं undefined। वे नहीं हैं falseलेकिन वे झूठे हैं। जो पूछा गया था।
जोसेफ

11

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


1
पहले तो मैंने सोचा, "pssh, that overkill, यह पहले से ही अच्छी तरह से उत्तर दिया गया था।" लेकिन यह अच्छी तरह से प्रस्तुत किया गया था और जानकारीपूर्ण था। धन्यवाद।
मार्क एल।

8

var bके लिए सेट किया जाएगा true। इसका कारण यह है कि एक खाली स्ट्रिंग जावास्क्रिप्ट में एक 'फाल्सी' मान के रूप में गिना जाता है जैसा कि कुछ अन्य मान हैं।

कृपया मिथ्या मूल्यों के लिए http://www.sitepoint.com/javascript-truthy-falsy/ देखें


आप अपने जवाब में गलत हैं। var bवास्तव में सेट किया जाएगा trueक्योंकि var aयदि आप कोड को देखते हैं तो यह विपरीत है ।
बोमबेक

@bombek धन्यवाद - मैं ऊपर हूँ। लगता है कि मूल प्रश्न को मेरे उत्तर के बाद संपादित किया गया था (मानों को चारों ओर स्वैप किया गया था)
जोनाथन बोल्स्टर

5

अभिव्यक्तियों के उदाहरण जिन्हें झूठ में परिवर्तित किया जा सकता है, वे हैं जो अशक्त, 0, रिक्त स्ट्रिंग ("") या अपरिभाषित का मूल्यांकन करते हैं। ( एमडीएन संदर्भ देखें )

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