2013-01-02 6 views
15

यह आमतौर पर ज्ञात है कि {} किसी ऑब्जेक्ट को परिभाषित करने का छोटा तरीका [] एक सरणी के लिए है।क्यों {}! = ({}) जावास्क्रिप्ट में?

लेकिन अब मैं सोच रहा हूँ क्यों:

{} != ({}) 
  • {} अपरिभाषित
  • ({}) का मूल्यांकन "सही" वस्तु

क्यों जावास्क्रिप्ट इस तरह व्यवहार कर रहा है का मूल्यांकन करता है?

उदाहरण के लिए 1(1) के बराबर है, तो {}({}) के बराबर क्यों नहीं है?

+7

'{}! = ({}) 'एक वाक्यविन्यास त्रुटि है। –

+0

'1' और' {} 'काफी अलग जानवर हैं। –

+0

वैसे ही इसी कारणों से सरणी पर लागू होता है (क्योंकि सरणी भी ऑब्जेक्ट्स हैं): '[]! = []' सत्य है। – Stuart

उत्तर

22
{} != ({}) 

यह एक सिंटैक्स त्रुटि है: हालांकि, चर है कि एक ही वस्तु संदर्भित कर रहे हैं समानता पकड़ो।

SyntaxError: Unexpected token !=

{} ऐसा ambigious है। क्या यह एक खाली ब्लॉक है, या एक खाली वस्तु शाब्दिक है? यह असफल रहा है क्योंकि एक तुलना ऑपरेटर ब्लॉक का पालन नहीं कर सकता है।

इसेष्ठक के साथ लपेटकर पार्सर इसे अभिव्यक्ति के रूप में मानता है। एक अभिव्यक्ति में एक ब्लॉक नहीं हो सकता है, इसलिए यह जानता है कि यह एक वस्तु है।

हालांकि, अगर आप एक अभिव्यक्ति में है कि तुलना लपेट ...

({} != ({})) 

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

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

+0

क्या आप मुझे बता सकते हैं कि यह क्या करता है '/ * इंस्टेंस विधियों */ \t hasOwn = ({})। हैऑनप्रोपर्टी, '[jQuery स्रोत] में (http://code.jquery.com /jquery-1.11.0.js)? (वाई) – loveNoHate

+1

@ डोलरवार यह अपना प्रश्न हो सकता है। यह वही बात है, लेखक 'ऑब्जेक्ट.प्रोटोटाइप' का संदर्भ चाहते हैं।hasOwnProperty' है, लेकिन एक वस्तु शाब्दिक के माध्यम से इसे एक्सेस कर रहे हैं। मेरे उत्तर में वर्णित अस्पष्टता के कारण, इसे कोष्ठक में लपेटा जाना चाहिए, अन्यथा इसे ब्लॉक के रूप में पार्स किया गया है और ब्लॉक पर कोई प्रॉपर्टी लुकअप नहीं है :) – alex

5

{} != {} सच है क्योंकि {} दोनों पूरी तरह से अलग-अलग वस्तुएं हैं।

​var a = {}, 
    b = a; 

assert(a == b)​ 
+1

क्या आप संदर्भों की जांच के लिए जावास्क्रिप्ट में '===' का उपयोग नहीं करना चाहते हैं? – Kevin

+2

@ केविन: '===' प्रकारों के बारे में है। ऑब्जेक्ट्स की तुलना हमेशा संदर्भों से की जाती है – zerkms

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