"foo"
एक स्ट्रिंग आदिम है। (यह अवधारणा सी # या जावा में मौजूद नहीं है)
new String("foo")
बॉक्सिंग स्ट्रिंग ऑब्जेक्ट है।
===
ऑपरेटर behaves differently on primitives and objects।
प्राइमेटिव्स (उसी प्रकार के) की तुलना करते समय, ===
सही होगा यदि दोनों के पास समान मूल्य है।
ऑब्जेक्ट की तुलना करते समय, ===
केवल तभी वापस आ जाएगा जब वे एक ही ऑब्जेक्ट (संदर्भ द्वारा तुलना) का संदर्भ लें। इस प्रकार, new String("a") !== new String("a")
।
आपके मामले में, ===
झूठी वापसी करता है क्योंकि ऑपरेंड विभिन्न प्रकार के होते हैं (एक आदिम है और दूसरा एक वस्तु है)।
Primitives ऑब्जेक्ट्स बिल्कुल नहीं हैं।
typeof
ऑपरेटर प्राइमेटिव्स के लिए "object"
वापस नहीं करेगा।
जब आप किसी आदिम की संपत्ति तक पहुंचने का प्रयास करते हैं (इसे किसी ऑब्जेक्ट के रूप में उपयोग करते हुए), जावास्क्रिप्ट भाषा किसी ऑब्जेक्ट पर बॉक्स करेगी, हर बार एक नई ऑब्जेक्ट बनायेगी। यह specification में वर्णित है।
यही कारण है कि आप पुरातन पर गुण नहीं डाल सकते:
var x = "a";
x.property = 2;
alert(x.property) //undefined
हर बार जब आप लिखना x.property
, एक अलग बॉक्सिंग String
वस्तु बन जाता है।
हो सकता है कि क्योंकि 'foo' शुद्ध स्ट्रिंग और' नई स्ट्रिंग ("foo" है) 'है ऑब्जेक्ट स्ट्रिंग –
पृष्ठभूमि: http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript –
यह अनुशंसा की जाती है कि 'नई स्ट्रिंग' (पूरी तरह से व्यर्थ) के साथ स्ट्रिंग न बनाएं '==' – Esailija