2014-04-10 10 views
7

मैं निम्नलिखित तुलना उम्मीद कर रहा था एक त्रुटि देने के लिए:जावास्क्रिप्ट में तुलना कैसे करता है (ए == बी == सी)?

var A = B = 0; 
if(A == B == 0) 
    console.log(true); 
else 
    console.log(false); 

लेकिन अजीब यह false देता है।

इससे भी अधिक अजीब,

console.log((A == B == 1)); 

रिटर्न true

यह "टर्नरी" प्रकार की तुलना कैसे काम करती है?

+7

एक == बी सच और सच है 0 –

+0

आपको लगता है कि, 'अगर (ए == 0 && बी == 0)' जैसे तुलना नहीं कर सकते नहीं है – adeneo

उत्तर

6

सबसे पहले, हम यह समझना होगा कि एक नंबर और एक बूलियन मान के बीच एक == तुलना एक करने के लिए बूलियन मान के आंतरिक प्रकार रूपांतरण में परिणाम होगा की जरूरत है बाएं से दाएं संख्या (true1 हो जाता है और false0 हो जाता है)

अभिव्यक्ति आप से पता चला है मूल्यांकन किया जाता है। तो, पहले

A == B 

मूल्यांकन किया जाता है और परिणाम true है और आप 0. दौरान true के बाद से हो जाता है 1 तुलना के साथ true तुलना कर रहे हैं, 1 == 0false मूल्यांकन करता है। लेकिन जब आप कहते हैं कि

console.log((A == B == 1)); 

A == Btrue है, जो जब संख्या के साथ तुलना में, 1 हो जाता है और आपको लगता है कि 1 के साथ फिर से तुलना कर रहे हैं। यही कारण है कि यह true प्रिंट करता है।

1
if((A == B)&& (A== 0)&& (B==0)) 
    console.log(true); 
else 
    console.log(false); 
2

पहले, A == B रिटर्न true है, जो तब 0 की तुलना में है, true == 0 जो झूठी लौटाता है, या true == 1 जो सच देता है।

2

यह पहले ए == बी के लिए आपके खंड की जांच करता है, जो सच है, यह सही == 0, और 0 गलत जांचने से पहले है। तो जब आप ए == बी == 1 की जांच करते हैं, तो आप ए == बी की जांच करते हैं, जो सत्य है, और सत्य == 1. तो फिर यह सच हो जाता है। आप इस तरह से कुछ करना चाहिए क्या तुम सच में सभी संभावनाओं की जांच करना चाहते हैं:

if((A==B) && (A==0)) 
    console.log(true); 
else 
    console.log(false); 
1

आप बाएं से दाएं काम कर सकते हैं। इस मामले में आप पहले जांचें कि ए == बी, तो आप यह जांचते हैं कि यह 0 के बराबर है या नहीं। इसलिए ए == बी, यह सच है। तो अब यह (सच == 0) बन जाता है, जो झूठा है। यदि ए = 1, बी = 2, तो (ए == बी == 0) सच हो जाएगा! ऐसा इसलिए है क्योंकि ए == बी झूठा है और (झूठा == 0) सच है!

6

= तरह असाइनमेंट ऑपरेटर हैं राइट साहचर्य: जब वहाँ इन ऑपरेटरों एक ही पूर्वता है की एक श्रृंखला है, वे कार्रवाई की जाती है सही-से-बाएँ हां, तो A = B = 0, A = (B = 0) (B = 0 रिटर्न 0 के रूप में संसाधित किया जाता है ए और बी दोनों 0 के रूप में समाप्त होते हैं)।

समानता ऑपरेटरों जैसे == बाएं-सहयोगी: समान-प्राथमिकता ऑपरेटर बाएं से दाएं संसाधित होते हैं। A == B == 0 को (A == B) == 0 के रूप में संसाधित किया गया है, और चूंकि A == B सत्य है (1), यह 1 == 0 बन जाता है, जो झूठा (0) है।

इसी प्रकार, A == B == 1 को (A == B) == 1 के रूप में संसाधित किया गया है, जो 1 == 1 बन जाता है, जो सत्य है (1)।

स्रोत और अधिक जानकारी: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

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