2013-06-27 12 views
6

0 == false और '0' == false साथ, दोनों की सच्ची0 बनाम '0' बूलियन ऑपरेटरों

हालांकि, (true && 0) 'असत्य' है रहे हैं, जबकि (true && '0') 'सही' है।

क्यों?

+8

एक समानता तुलना की ऑपरेंड कुछ नियमों का पालन करें। आपके पहले दो उदाहरणों के साथ, वे संख्याओं में परिवर्तित हो जाते हैं, और इसलिए बराबर होते हैं। '&&' और '||' का उपयोग करके, ऑपरेटरों का सत्यता के लिए परीक्षण किया जाता है। केवल झूठे मूल्य 'झूठी', '0',' "" ',' null', 'अपरिभाषित', और 'NaN' हैं। उम्मीद है कि यह मदद कर सकता है: http://es5.github.io/#x11.9.3 – Ian

+0

आपके बारे में idk लेकिन जब मैं कंसोल में '(true && 0)' टाइप करता हूं तो मुझे '0' मिलता है और जब मैं' (true && '0') 'मुझे मिलता है' '0 "' – aug

+2

@aug मुझे लगता है कि वे 'if' कथन – Ian

उत्तर

6

सार तुलना (==) नियम ES5 11.9.3 में वर्णित हैं तार्किक ऑपरेटरों (&&) के लिए नियमों को ES5 11.11 में वर्णित कर रहे हैं।

संक्षेप में, ==&& से अधिक जटिल है। && अपने ऑपरेटरों का मूल्यांकन करने के लिए आंतरिक ToBoolean() का उपयोग करता है, == में ऐसी कई स्थितियां हैं जिनके परिणामस्वरूप ToBoolean(), ToNumber(), और/या ToPrimitive() का उपयोग हो सकता है।

  1. (0 == false) == true:

    7. यदि प्रकार (वाई) बूलियन है, तुलना का परिणाम लौट एक्स == ToNumber (y)

    ToNumber(false) === 0, तो 0 == 0, तो true

  2. ('0' == false) == true:

    यह भी चरण 7 से होकर गुजरता है, '0' == 0 हो जाती है।

    फिर, शीर्ष पर से शुरू है, यह तक पहुँचने के लिए चरण 5:

    5. यदि प्रकार (x) है स्ट्रिंग और प्रकार (वाई) नंबर, तुलना ToNumber का परिणाम लौट (एक्स) == वाई।

    ToNumber('0') === 0, तो फिर 0 == 0, और फिर से true

  3. !!(true && 0) == false

    && बस 1 संकार्य रिटर्न अगर यह falsy (ToBoolean(...) === false) है, या 2 संकार्य।

    यह कड़ाई से (true && 0) === 0 है।

    और, जब एक if शर्त के रूप में प्रयोग किया जाता है, परिणाम (0) के रूप में अच्छी तरह से passed through ToBoolean(...) और ToBoolean(0) === false हो जाएगा।

  4. !!(true && '0') == true

    फिर, यह 2 संकार्य देता है, '0'

    इस बार, तथापि, ToBoolean('0') === true'0' के रूप में एक गैर खाली स्ट्रिंग, यह truthy बना रही है।

इसके अलावा, अगर आप सरल तुलना नियम चाहते हैं, सख्त तुलना (===, 11.9.6) का उपयोग करें।

+1

' (true &&' 0 ') == true' में वास्तव में गलत हैं (' 0 '! = सच')। यदि आप सच्चाई और 'टूबोलियन' ऑपरेशन पर जोर देना चाहते हैं तो आप बेहतर तरीके से '!! (true && '0')' – Bergi

-2

'0' (या कोई गैर-खाली स्ट्रिंग) जेएस में 'सत्य' है। == ऑपरेटर, हालांकि, कुछ अजीब प्रकार-जबरदस्ती करता है, यही कारण है कि क्रॉकफोर्ड समेत कई प्रमुख जेएस आंकड़े इसे हतोत्साहित करते हैं। यह एक अच्छा उदाहरण है कि आपको इसे क्यों टालना चाहिए, यह स्ट्रिंग '0' लेता है और इसे एक झूठी मान में जोड़ता है।

यह लिंक है जिसे इस प्रक्रिया बताते है:

http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html

If Type(x) is Boolean, return the result of the comparison 
    ToNumber(x) == y: false == 0 and true == 1 but true != 2 

तो भी अपने उदाहरण से अजनबी यह है:

('1' == true) // true 
('2' == true) // false! 
+0

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

संबंधित मुद्दे