जावास्क्रिप्ट में सभी गलत मूल्य


215

जावास्क्रिप्ट में क्या मूल्य हैं जो 'फाल्सी' हैं , जिसका अर्थ है कि वे अभिव्यक्ति में झूठ के रूप में मूल्यांकन करते हैं if(value), value ?और !value?


स्टैक ओवरफ्लो पर पहले से ही फाल्सी मूल्यों के उद्देश्य की कुछ चर्चाएं हैं , लेकिन कोई भी संपूर्ण उत्तर सूची में कोई संपूर्ण संपूर्ण सूची नहीं है।

मुझे एमडीएन जावास्क्रिप्ट संदर्भ पर कोई पूरी सूची नहीं मिली , और मुझे यह जानकर आश्चर्य हुआ कि शीर्ष परिणाम जब संपूर्ण की तलाश में थे, तो जावास्क्रिप्ट में झूठी मूल्यों के आधिकारिक सूची ब्लॉग लेख थे, जिनमें से कुछ में स्पष्ट चूक थे (उदाहरण के लिए, NaN), और इनमें से किसी के पास स्टैक ओवरफ्लो जैसा कोई प्रारूप नहीं था, जहां टिप्पणी, या वैकल्पिक उत्तर को क्वर्क, आश्चर्य, चूक, गलतियों या चेतावनी को जोड़ने के लिए जोड़ा जा सकता है। तो, यह एक बनाने के लिए समझ में आता था।




5
dorey.github.io/JavaScript-Equality-Table एक बेहतरीन संसाधन है और इसमें if()सच्चाई के लिए एक टैब है।
मेघावी

4
वाह, वास्तव में उपयोगी, धन्यवाद! [[]] == ""लेकिन [] != []? मेरा सिर दर्द होता है ...
user56reinstatemonica8

ECMA 262 विनिर्देश इन तुलनात्मक नियमों का विवरण देते हैं, विशेष रूप से 11.9.1 को 11.9.6 के माध्यम से सुरक्षित करते हैं: ecma-international.org/ecma-262/5.1/#sec-11.9.3 यह प्रफुल्लित होगा यदि आपने इस संदर्भ को शामिल करने के लिए अपना उत्तर अपडेट किया है , क्योंकि यह इस बात के नियम प्रदान करता है कि सही / गलत निर्धारण (किए जाने वाले) कैसे किए जाते हैं।
शॉन विल्सन

जवाबों:


367

जावास्क्रिप्ट में गलत मान

  • false
  • के शून्य Numberके प्रकार: 0और भी -0, 0.0और हेक्स प्रपत्र 0x0( धन्यवाद RBT )
  • शून्य का BigIntप्रकार: 0nऔर -0n(2020 में नया, धन्यवाद GetMeARemoteJob )
  • "", ''और ``- लंबाई के तार ०
  • null
  • undefined
  • NaN
  • document.all (केवल HTML ब्राउज़र में)

"फाल्सी" का सीधा मतलब है कि जावास्क्रिप्ट का आंतरिक ToBooleanकार्य वापस आता है false ToBooleanअंडरलाइज़ !value, value ? ... : ...;और if (value)। यहां इसकी आधिकारिक विनिर्देश (2020 के कामकाज का मसौदा) ( 1997 में बहुत पहले ECMAscript विनिर्देश के बाद से केवल ES6 के प्रतीक के अतिरिक्त परिवर्तन हैं , जो हमेशा सत्य होते हैं, और BigInt, ऊपर उल्लेख किया गया है:

अनिर्धारित: झूठे लौटें।  अशक्त: झूठे लौटे।  बूलियन: वापसी तर्क।  संख्या: यदि तर्क +0, -0, या NaN है, तो गलत लौटें;  अन्यथा सच लौटाओ।  स्ट्रिंग: यदि तर्क रिक्त स्ट्रिंग है (इसकी लंबाई शून्य है), तो गलत लौटें;  अन्यथा सच लौटाओ।  BigInt: यदि तर्क 0n है, तो गलत लौटें;  अन्यथा सच लौटाओ।  प्रतीक: सच लौटा दो।  वस्तु: सच्चा लौटना।


तुलना ==(ढीली समानता)

यह मिथ्या मूल्यों के साथ तुलना करने के== बारे में बात करने लायक है , जो ToNumber()अंतर्निहित मतभेदों के कारण उपयोग करता है और कुछ भ्रम पैदा कर सकता है। वे प्रभावी रूप से तीन समूह बनाते हैं:

  • false, 0, -0, "", '' सभी एक दूसरे के साथ मेल खाते हैं ==
    • जैसे false == "", '' == 0और इसलिए4/2 - 2 == 'some string'.slice(11);
  • null, undefined साथ मिलाना ==
    • जैसे null == undefinedलेकिनundefined != false
    • यह भी उल्लेख के लायक है कि जब तक typeof nullरिटर्न 'object', nullहै एक वस्तु नहीं है, यह एक लम्बे समय से बग / मोड़ है कि आदेश संगतता बनाए रखने के लिए तय नहीं किया गया था। यह एक सच्ची वस्तु नहीं है, और वस्तुएं सत्य हैं ( document.allजब HTML में जावास्क्रिप्ट को लागू किया जाता है तो उस "विलफुल उल्लंघन" को छोड़कर )
  • NaN कुछ भी मेल नहीं खाता, ==या ===, खुद भी नहीं
    • जैसे NaN != NaN, NaN !== NaN, NaN != false,NaN != null

"सख्त समानता" ( ===) के साथ, ऐसे समूह नहीं हैं। केवल false === false

यह एक कारण है कि कई डेवलपर्स और कई स्टाइल गाइड (जैसे मानकज ) पसंद करते हैं ===और लगभग कभी भी उपयोग नहीं करते हैं ==


सत्य मूल्य जो वास्तव में है == false

"ट्रूथी" का सीधा मतलब है कि जावास्क्रिप्ट का आंतरिक ToBooleanफ़ंक्शन वापस आ जाता है trueजावास्क्रिप्ट का एक क्विक (और ===अधिक अच्छा कारण के बारे में पता होना) से अवगत होना== : एक मूल्य के लिए सत्य ( ToBooleanरिटर्न true) होना संभव है , लेकिन यह भी == false

आपको लगता if (value && value == false) alert('Huh?')है कि एक तार्किक असंभवता हो सकती है, लेकिन ऐसा नहीं हो सकता है:

  • "0"और '0'- वे गैर-रिक्त तार हैं, जो सत्य हैं, लेकिन जावास्क्रिप्ट के ==मिलान समतुल्य तारों (जैसे 42 == "42") के साथ होते हैं । के बाद से 0 == falseहै, , ।"0" == 0"0" == false
  • new Number(0)और new Boolean(false)- वे वस्तुएं हैं, जो सत्य हैं, लेकिन ==उनके मूल्यों को देखता है, जो == false
  • 0 .toExponential(); - एक संख्यात्मक मूल्य के साथ एक वस्तु 0
  • कोई भी समान निर्माण जो आपको एक प्रकार से लिपटे हुए झूठे-समान मूल्य देता है जो सत्य है
  • [], [[]]और [0]( जावास्क्रिप्ट इक्विटी टेबल लिंक के लिए धन्यवाद क्लाउडफीट )

कुछ और सत्य मूल्य

ये केवल कुछ मूल्य हैं जो कुछ लोगों को गलत होने की उम्मीद कर सकते हैं, लेकिन वास्तव में सत्य हैं।

  • -1 और सभी गैर-शून्य नकारात्मक संख्या
  • ' ', " ", "false", 'null'... सब तार कि सिर्फ श्वेत रिक्ति हैं सहित गैर-रिक्त स्ट्रिंग,
  • कुछ भी typeof, जो हमेशा एक गैर-रिक्त स्ट्रिंग लौटाता है, उदाहरण के लिए:

  • किसी भी वस्तु (सिवाय document.allब्राउज़रों में "विलफुल उल्लंघन" के ; याद रखें कि nullवास्तव में typeofअन्यथा सुझाव देने के बावजूद कोई वस्तु नहीं है)। समेत:

    • {}
    • []
    • function(){}या () => {}(कोई भी कार्य, जिसमें खाली कार्य शामिल हैं)
    • Error और का कोई भी उदाहरण Error
    • कोई नियमित अभिव्यक्ति
    • new(सहित new Number(0)और सहित new Boolean(false)) कुछ भी बनाया
  • कोई भी प्रतीक

true, 1, "1"और [1]वापसी trueजब साथ एक दूसरे की तुलना ==


3
FYI करें, क्या !, ifऔर ?..:आम बात यह है कि वे ToBooleanमूल्य पर आंतरिक फ़ंक्शन को कहते हैं । कैसे उन मूल्यों के संदर्भ में व्यवहार करते हैं !, ifआदि पहले से ही उनके नाम से गर्भित है: वे "falsy" मान हैं। मैं थोड़ा डर है कि दूसरों के जवाब पढ़ सकते हैं और लगता है कि होगा "ओह तो इस संदर्भ (में !, if, ?...:), मूल्य है false, लेकिन साथ !!, यह true" है, लेकिन बुनियादी विचार की समझ में नहीं आता। दो अन्य बिंदु: 1) v ? true : falseसिर्फ एक क्रिया तरीका है !!v। 2) typeof हमेशा एक गैर-रिक्त स्ट्रिंग देता है, जो सत्य है।
फेलिक्स क्लिंग

1
यानी देखने में typeof nullया typeof undefinedविशेष रूप से कोई मतलब नहीं है । आप बस यह कह सकते हैं कि गैर-रिक्त तार सत्य हैं।
फेलिक्स क्लिंग

1
मैं देखता हूं, लेकिन इसका मूल प्रश्न से कोई लेना-देना नहीं है;) बहुत अधिक संबंधित कुछ जोड़ना लेकिन प्रासंगिक जानकारी पाठकों के लिए भ्रामक नहीं हो सकती है।
फेलिक्स क्लिंग

5
मैंने अभी-अभी सीखा है कि document.allयह मिथ्या है
क्लाउडीयू

3
ढीली तुलना के बारे में: क्योंकि बुलियन को संख्याओं में परिवर्तित किया जाता है, x == falseकॉल करेगा ToNumber(x)जो बस से बहुत अलग है ToBoolean(x)। समझाने लायक हो सकता है। इसके अलावा, मैंने अभी देखा कि मैंने इस उत्तर पर पहले ही टिप्पणी कर दी थी: D
फेलिक्स क्लिंग

3

गैर-रिक्त स्ट्रिंग के बारे में मत भूलना "false"जो मूल्यांकन करता हैtrue


8
... और इसलिए एक मिथ्या मूल्य नहीं है, जो पूछा गया था?
Bergi

5
टच। यह एक ऐसा मूल्य है जो आप गलत होने की उम्मीद कर सकते हैं और ऐसा नहीं है, जो अभी भी जागरूक होने के लायक है, और मुझे लगता है, एक व्यापक सूची में उल्लेख का गुण है
MrMcPlad

4
सूची में जोड़ा गया ... लेकिन आइए इसे सभी संभावित सत्य मूल्यों की एक व्यापक सूची में बदलने की कोशिश न करें! उस समय थोड़ी देर होगी:-)
user56reinstatemonica8

3

बस @ user568458 की मिथ्या मूल्यों की सूची में जोड़ें:

  • पूर्णांक संख्या 0 के अलावा, दशमलव संख्या 0.0, 0.00 या ऐसी कोई भी शून्य संख्या भी एक मिथ्या मूल्य है।

    var myNum = 0.0;
    if(myNum){
        console.log('I am a truthy value');
    }
    else {
        console.log('I am a falsy value');
    }

    ऊपर कोड स्निपेट प्रिंट I am a falsy value

  • इसी प्रकार संख्या 0 का हेक्स प्रतिनिधित्व भी एक मिथ्या मूल्य है जैसा कि नीचे दिए गए कोड स्निपेट में दिखाया गया है:

    var myNum = 0x0; //hex representation of 0
    if(myNum){
        console.log('I am a truthy value');
    }   
    else {
        console.log('I am a falsy value');
    }

    कोड से ऊपर फिर से प्रिंट झलकी I am a falsy value


7
जावास्क्रिप्ट में पूर्णांक संख्या नहीं है। 0, 0x0, 0.0और 0.00एक ही आईईईई-754 64-बिट चल बिन्दु मान शून्य के लिए सिर्फ अलग शाब्दिक हैं।
11:30 पर fredoverflow

1

विषय के अलावा, ES2020 के रूप में हमारे पास एक नया मूल्य है जो झूठा है, यह BigInt शून्य (0n) है:

0n == false // true
-0n == false // true

तो इस के साथ, अब हमारे पास कुल 7 "मिथ्या" मूल्य हैं (दस्तावेज़ सहित नहीं। जैसा कि ऊपर उपयोगकर्ता द्वारा उल्लेख किया गया है क्योंकि यह डोम और जेएस का हिस्सा नहीं है)।


1
अच्छा! धन्यवाद, मैंने अभी तक उसके बारे में नहीं सुना था, मैंने इसे बढ़ाने के लिए आपके उत्तर का श्रेय देने वाली कड़ी के साथ इसे बड़ी सूची में जोड़ दिया है
user56reinstatemonica8
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.