2013-09-03 6 views
11

इस प्रकार एक रॉक कागज कैंची खेल (बुलाया टॉस) के लिए मेरे कोड है:ReferenceError: काम में अवैध बाएं हाथ की ओर

var toss = function (one,two) { 
    if(one = "rock" && two = "rock") { 
     console.log("Tie! Try again!"); 
    } 
    // more similar conditions with `else if` 
}; 

जब मैं मानकों में प्रवेश

toss("rock","rock") 

मैं इस त्रुटि कोड:

"ReferenceError: Invalid left-hand side in assignment"

इसे कैसे ठीक करें? इस त्रुटि का क्या अर्थ है और यह त्रुटि कब हो सकती है?

+0

तीन "टाई" मामलों में सरल किया जा सकता एक भी 'अगर (एक == दो)' –

उत्तर

35

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

if (one == 'rock' && two == 'rock') { 
    console.log('Tie! Try again!'); 
} 
+3

मैं एक dumbass कर रहा हूँ .... ....धन्यवाद! स्पष्टीकरण के लिए – Kevin

+0

, अंतर == और === के बीच क्या होगा? – Kevin

+0

उपर्युक्त टिप्पणी गलत है, ईसीएमए निर्दिष्ट करता है कि यह एक प्रकार की जांच नहीं है, यह टाइप ऑपरेशन नामक एक ऑपरेशन करता है। यह जानना वास्तव में उपयोगी है, यह जवाब देखें http://stackoverflow.com/questions/19915688/what-exactly-is-type-coercion-in-javascript – VladNeacsu

1

आम कारण हैं: समानता के बजाय

  • असाइनमेंट (=) के उपयोग (==/===)
  • समारोह foo() = 42 बजाय गुजर तर्क (foo(42))
  • के परिणाम के लिए बताए
  • बस सदस्य नाम गायब (यानी कुछ डिफ़ॉल्ट चयन मानते हैं): getFoo() = 42getFoo().theAnswer = 42 या सरणी अनुक्रमणिका के बजाय getArray()[0]= 42

के बजाय getArray() = 42 ing इस विशेष मामले आप == (या बेहतर === - What exactly is Type Coercion in Javascript?) का उपयोग करना चाहते में समानता के लिए जाँच करने के लिए (जैसे if(one === "rock" && two === "rock"), लेकिन यह वास्तविक कारण आप त्रुटि हो रही है जटिल काम है।

त्रुटि का कारण Operator precedence है। विशेष रूप से हम && (प्राथमिकता 6) और = (प्राथमिकता 3) की तलाश में हैं।

की प्राथमिकता के अनुसार अभिव्यक्ति में ब्रेसिज़ रखते हैं - && तो यह पहले समान 3+4*5+63+(4*5)+6 के रूप में एक कैसे करेंगे निष्पादित किया जाता है = से अधिक है:

if(one= ("rock" && two) = "rock"){... 

अब हम a = b = 42 जैसे कई कार्य के लिए इसी तरह की अभिव्यक्ति है जो a = (b = 42) के रूप में निष्पादित दाएं से बाएं सहयोगीता के कारण। तो अधिक ब्रेसिज़ जोड़ने:

if(one= ( ("rock" && two) = "rock") ){... 

अंत में हम वास्तविक समस्या के लिए पहुंचे: ("rock" && two) एल-मूल्य है कि को सौंपा जा सकता करने के लिए मूल्यांकन नहीं किया जा सकता है (इस विशेष मामले में यह truthy रूप two की मूल्य हो जाएगा) ।

ध्यान दें कि यदि आप ब्रेसिज़ के साथ प्रत्येक "समानता" के आस-पास कथित प्राथमिकता से मेल खाने के लिए ब्रेसिज़ का उपयोग करेंगे, तो आपको कोई त्रुटि नहीं मिलती है।जाहिर है कि भी अलग परिणाम की तुलना में आप उम्मीद थी उत्पादन - दोनों चर के मूल्य में परिवर्तन और से logial && के व्यवहार के कारण "rock" && "rock" दो तारों पर "rock" में जिसके परिणामस्वरूप (जो बारी में truthy है) हर समय && कार्य करें:

if((one = "rock") && (two = "rock")) 
{ 
    // always executed, both one and two are set to "rock" 
    ... 
} 

त्रुटि और अन्य मामलों में जब यह भी हो सकता है पर और भी अधिक जानकारी के लिए - देखने के विनिर्देश:

Assignment

LeftHandSideExpression = AssignmentExpression
...
Throw a SyntaxError exception if the following conditions are all true:
...
IsStrictReference(lref) is true

Left-Hand-Side Expressions

और The Reference Specification Type IsStrictReference समझा:

... function calls are permitted to return references. This possibility is admitted purely for the sake of host objects. No built-in ECMAScript function defined by this specification returns a reference and there is no provision for a user-defined function to return a reference...

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

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