2011-10-10 16 views
15

यह Firebug में किया जाता है:जावास्क्रिप्ट में, {a: 1} == {a: 1} एक त्रुटि क्यों देता है, और ({a: 1}) == {a: 1} काम करेगा?

>>> {a : 1} == {a : 1} 
SyntaxError: syntax error 
[Break On This Error] {a : 1} == {a : 1} 

>>> ({a : 1}) == {a : 1} 
false 

तो यह ({a : 1}) == {a : 1} होने की जरूरत है, यही कारण है कि है?

उत्तर

16

क्योंकि {a : 1} एक घोषणा है और यह == द्वारा पालन तथापि

({ a : 1 }) अभिव्यक्ति है और द्वारा ==

यह मूलतः नियम व्याकरण में परिभाषित किया गया है का पालन किया जाना करने की अनुमति है होना करने के लिए अनुमति नहीं है।

हालांकि ध्यान दें कि ({ a: 1} == { a: 1}) मान्य है। तो समानता अभिव्यक्ति मान्य है।

इसका मतलब है कि {a : 1} == { a : 1 } बस वैध कथन मान्य नहीं है।

12.4 of the ES5.1 spec कहते

नोट एक ExpressionStatement एक खोलने घुंघराले ब्रेस के साथ शुरू नहीं कर सकते क्योंकि यह है कि यह एक ब्लॉक के साथ अस्पष्ट बना सकता है। साथ ही, एक अभिव्यक्ति स्टेटमेंट फ़ंक्शन कीवर्ड से प्रारंभ नहीं हो सकता है क्योंकि इससे फ़ंक्शनक्लेक्शनेशन के साथ संदिग्ध हो सकता है।

एक sidenote के रूप आपको लगता है कि

({a : 1}) != {a : 1} क्योंकि वे बयान के एक ब्लॉक, के रूप में नहीं शुरू करने के रूप में दो नई वस्तुओं

+0

क्या आप निश्चित हैं? मैं उम्मीद करता हूं कि '! ==' असफल हो लेकिन '! =' – spraff

+6

@spraff: हाँ, वह निश्चित है। –

13

अग्रणी "{" चरित्र पार्सर द्वारा व्याख्या की है कर रहे हैं मिलेगा एक अभिव्यक्ति शुरू करना यह भाषा में एक अस्पष्टता है और जिस तरह से इसे हल किया गया है (spec के अनुसार)।

यह function कीवर्ड के आसपास अस्पष्टता के समान है। जब कोई कथन function से शुरू होता है, तो यह एक फ़ंक्शन घोषणा कथन है, भले ही यह अभिव्यक्ति की शुरुआत के रूप में हो। कुछ नियमों के अनुसार पार्सर्स को ऐसी अस्पष्टताओं को हल करना होगा।

+3

[12.4] (http://es5.github.com/?utm_source=javascriptweekly&utm_medium=email#x12.4) संदर्भ है कि '{' एक ब्लॉक होना चाहिए और अभिव्यक्ति कथन होने की अनुमति नहीं है – Raynos

+0

आह धन्यवाद ! मुझे वास्तव में एक्मा साइट पर वापस जाने और इसे हर समय डाउनलोड करने के बजाय इन दिनों में से किसी एक की कल्पना को सहेजने की आवश्यकता है - यह बहुत धीमी है :-) – Pointy

+0

एनोटेटेड ES5.1 बुकमार्क करें – Raynos

0

मुझे लगता है कि आप पहले दोनों ऑब्जेक्ट्स को चर के लिए असाइन करना चाहते हैं और कथन के भीतर उन्हें बनाने के बजाय उन दो चरों की तुलना करना चाहते हैं। आपकी समस्या इस तथ्य पर निर्भर करती है कि आप कथन में असाइन कर रहे हैं।() जोड़कर आप उस असाइनमेंट को एक कथन के रूप में लपेट रहे हैं और यह ठीक काम करता है।

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