2013-05-18 8 views
18
a = 1; 
b = "1"; 
if (a == b && a = 1) { 
    console.log("a==b"); 
} 

जावास्क्रिप्ट कोड ऊपर गूगल क्रोम में if बयान 26.0.1410.43 में एक त्रुटि में परिणाम होगा:जावास्क्रिप्ट ऑपरेटर "&&" इतना अजीब क्यों है?

Uncaught ReferenceError: Invalid left-hand side in assignment

मुझे लगता है कि इस वजह से बयान && के दूसरे भाग में चर a है , a=1 असाइन नहीं किया जा सकता है। हालांकि, जब मैं नीचे दिए गए कोड को आजमाता हूं, तो मैं पूरी तरह उलझन में हूं!

a = 1; 
b = "1"; 
if (a = 1 && a == b) { 
    console.log("a==b"); 
} 

एक कथन सही क्यों है लेकिन दूसरा कथन गलत है?

+3

वैसे भी आप यहां पूरा करने की कोशिश कर रहे हैं? कोड वास्तव में क्या करना चाहिए? –

+2

ऑपरेटर प्राथमिकता –

+1

के लिए हमेशा '(' और ')' का उपयोग करें, आपने यहां कोई गलती की है, आपको इसे 'if (a == 1 && a == b)' लिखना होगा। –

उत्तर

21

दूसरा संस्करण a = (1 && a == b) के रूप में पार्स किया गया है; यानी, 1 && a == b अभिव्यक्ति का परिणाम a पर असाइन किया गया है।

पहला संस्करण काम नहीं करता है क्योंकि असाइनमेंट के लेफ्टथेंड पक्ष को आपके जैसा अपेक्षित नहीं किया जाता है। यह अभिव्यक्ति को पारदर्शी करता है जैसे कि आप को पर राइटथैंड साइड परपर एक मान असाइन करने का प्रयास कर रहे हैं।

यह सब विभिन्न ऑपरेटरों की प्राथमिकता पर आधारित है। यहां समस्या इस तथ्य से उत्पन्न होती है कि = अन्य ऑपरेटरों की तुलना में कम प्राथमिकता है।

+2

दोनों अभिव्यक्तियों को पूरी तरह से सही ढंग से पार्स किया गया है। वे ओपी की उम्मीद के रूप में नहीं पा रहे हैं ... – Alnitak

+0

@Annitak: हाँ, मुझे लगता है कि आपका phrasing बेहतर है। –

+1

ऑपरेटर प्राथमिकता – MofX

6

क्योंकि संचालन का क्रम आप अपेक्षा नहीं करते हैं। a == b && a = 1(a == b && a) = 1 के बराबर है जो false = 1 के बराबर है।

यदि आप वास्तव में असाइनमेंट करना चाहते हैं, तो आपको इसके चारों ओर कोष्ठक का उपयोग करने की आवश्यकता है: a == b && (a = 1)

60

= has lower operator precendence than both && and ==, जिसका अर्थ है कि अपना पहला काम

if ((a == b && a) = 1) { 

में बदल जाता है जब से तुम इस तरह से एक अभिव्यक्ति के लिए असाइन नहीं कर सकते, यह आपको एक त्रुटि दे देंगे।

+0

धन्यवाद की सूची के लिए https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence देखें! धन्यवाद! – sherlock

+0

यह मेरे लिए नया था, एमडीएन –

2

if (a = 1 && a == b) में,

संचालन पहली बार प्रदर्शन किया जा करने के लिए 1 && a == b है। 1 &&a == b का परिणाम निष्पादित किया गया है। इस && ऑपरेशन का परिणाम a पर असाइन किया गया है।

+0

पर लिंक पोस्ट करने के लिए धन्यवाद यह पूरी तरह से सही नहीं है। == की तुलना में अधिक प्राथमिकता है &&। इसके परिणामस्वरूप निम्न मूल्यांकन आदेश: 1. 1 2. && -> बाएं हाथ की ओर से पहले से ही सत्य है, दाएं हाथ की ओर 3 का मूल्यांकन न करें।ए = 1 परिणाम वही है जैसा आपने कहा था। लेकिन 1 && का मूल्यांकन पहले नहीं किया जाता है, यह 1 && (a == b) है जहां एक == बी का मूल्यांकन कभी नहीं किया जाता है। सामान्य में के लिए एक = ख && ग == घ मूल्यांकन आदेश हैं (यह मानते हुए ख falsy है) हो: 1. ख 2. ग == घ 3. ख && (ग == घ) 4। ए = (बी एंड& (सी == डी)) – MofX

+0

क्षमा करें। मैंने गलती को सही किया। – Deepu

+0

मेरी टिप्पणी भी गलत है;) इस बार आपको यह सही मिला। एक और बी बी दिए गए बी के साथ ही मूल्यांकन किया जाएगा, यदि कोई सत्य है। मेरी आखिरी टिप्पणी में मैंने कहा कि झूठा होना था। – MofX

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