questions - javascript programs




जावास्क्रिप्ट स्ट्रिंग प्रकार और स्ट्रिंग ऑब्जेक्ट के बीच अंतर? (2)

मैं ईसीएमए -262 मानक ( ईसीएमएस्क्रिप्ट भाषा विशिष्टता, तीसरा संस्करण, यदि यह इसके लिए महत्वपूर्ण है) के साथ गड़बड़ कर रहा है - मुझे स्ट्रिंग प्रकार / स्ट्रिंग ऑब्जेक्ट पर तीसरे और 5 वें संस्करण के बीच कोई अंतर नहीं मिला है)।

एक चीज है जो मुझे परेशान करती है: स्ट्रिंग प्रकार और स्ट्रिंग ऑब्जेक्ट के बीच का अंतर। हां, मुझे इस अर्थ में अंतर पता है कि स्ट्रिंग टाइप 16-बिट यूटीएफ -16 इकाइयों का अनुक्रम है और स्ट्रिंग ऑब्जेक्ट एक अंतर्निर्मित ऑब्जेक्ट है जिसमें इसकी आंतरिक क्लास प्रॉपर्टी "स्ट्रिंग" पर सेट है और इसकी आंतरिक वैल्यू प्रॉपर्टी सेट है स्ट्रिंग प्रकार का एक मूल्य।

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

document.writeln(typeof "foo"); // 'string'
document.writeln(typeof new String("foo")); // 'object'

पहला प्रकार वास्तविक स्ट्रिंग प्रकार है और दूसरा ऑब्जेक्ट टाइप है (यह क्लास स्ट्रिंग का ऑब्जेक्ट है, लेकिन इसका डेटा प्रकार ऑब्जेक्ट है)। हालांकि, इसे देखकर:

"foo".charAt(0);

fooStrObj = new String("Foo");
fooStrObj.charAt(0);

वे दोनों एक ही कार्य का पर्दाफाश करते हैं, लेकिन ईसीएमए -262 मानक में परिभाषित स्ट्रिंग प्रकार पर कोई फ़ंक्शन नहीं हैं; यह सभी कार्य स्ट्रिंग.प्रोटोटाइप ऑब्जेक्ट से हैं (और मैं इस तथ्य का कोई संदर्भ नहीं देख सकता कि स्ट्रिंग प्रकार ईसीएमए -262 मानक में स्ट्रिंग.प्रोटोटाइप ऑब्जेक्ट के सभी गुणों और कार्यों को जादुई रूप से उजागर करता है)। तो स्ट्रिंग प्रकार के मान स्वचालित रूप से स्ट्रिंग ऑब्जेक्ट में मूल स्ट्रिंग प्रकार मान के साथ अपनी आंतरिक मान संपत्ति के रूप में प्रचारित होते हैं?

और यदि उनका बिल्कुल वही व्यवहार किया जाता है (जो सभी उद्देश्यों और उद्देश्यों के लिए प्रतीत होते हैं), स्ट्रिंग का प्रतिनिधित्व करने के दो अलग-अलग तरीके क्यों हैं?


यह जावा में int और Integer बीच अंतर के समान है।

मानक के अनुसार, जब आप किसी विधि को कॉल करने का प्रयास करते हैं तो तार स्वचालित रूप से String ऑब्जेक्ट्स में परिवर्तित हो जाते हैं। ईसीएमए 262-3 सेक्शन 11.2.1 देखें; चरण 5 कॉल ToObject (जिसे धारा 9.9 में परिभाषित किया गया है)।

11.2.1 संपत्ति एक्सेसर्स
[...]
उत्पादन सदस्य एक्स्प्रेशन: सदस्य एक्सप्रेशन [अभिव्यक्ति] का मूल्यांकन निम्नानुसार किया जाता है:

  1. सदस्य एक्सप्लोरेशन का मूल्यांकन करें।
  2. GetValue पर कॉल करें (परिणाम (1))।
  3. अभिव्यक्ति का मूल्यांकन करें।
  4. GetValue पर कॉल करें (परिणाम (3))।
  5. कॉल टू ऑब्जेक्ट (परिणाम (2))।
  6. कॉल टूस्ट्रिंग (परिणाम (4))।
  7. प्रकार का एक संदर्भ लौटाएं जिसका आधार वस्तु परिणाम (5) है और जिसका संपत्ति नाम परिणाम (6) है।


9.9 ToObject

ऑपरेटर ToObject निम्न तालिका के अनुसार ऑब्जेक्ट प्रकार के मान के लिए अपने तर्क को परिवर्तित करता है:
[...]
एक नई स्ट्रिंग ऑब्जेक्ट बनाएं जिसका [[value]] गुण स्ट्रिंग के मान पर सेट हो। स्ट्रिंग ऑब्जेक्ट्स के विवरण के लिए 15.5 देखें।

एक विनिर्देश तकनीक के रूप में, यह एक हैक है कि यह समझाने के लिए कि स्ट्रिंग्स कैसे तरीके से प्रकट हो सकते हैं भले ही वे वास्तव में ऑब्जेक्ट्स न हों।

इसके अलावा, रैपर ऑब्जेक्ट्स बहुत उपयोगी नहीं हैं। मुझे नहीं पता कि वे भाषा में क्यों हैं। मैं चाहता हूं कि वे नहीं थे। :)


स्ट्रिंग्स जेएस में एक वैल्यू टाइप हैं, इसलिए उनके पास कोई प्रॉपर्टी नहीं है, कोई प्रोटोटाइप इत्यादि नहीं है। उन पर संपत्ति का उपयोग करने का कोई भी प्रयास तकनीकी रूप से जेएस [[ToObject]] रूपांतरण (संक्षेप में नई स्ट्रिंग) कर रहा है। ।

अंतर को अलग करने का आसान तरीका है (ब्राउज़र में)

a = "foo"
a.b = "bar"
alert("a.b = " + a.b); //Undefined

A = new String("foo");
A.b = "bar";
alert("A.b = " + A.b); // bar

इसके अतिरिक्त

"foo" == new String("foo")

सच है, यह == ऑपरेटर के अंतर्निहित प्रकार रूपांतरणों के कारण ही सच है

"foo" === new String("foo")

असफल हो जायेगी।






javascript