जावास्क्रिप्ट में स्ट्रिंग आदिम और स्ट्रिंग वस्तुओं के बीच अंतर क्या है?


116

से लिया MDN

स्ट्रिंग शाब्दिक (डबल या सिंगल कोट्स द्वारा चिह्नित) और स्ट्रिंग एक गैर-कंस्ट्रक्टर संदर्भ में स्ट्रिंग कॉल से लौटे (यानी, नए कीवर्ड का उपयोग किए बिना) आदिम तार हैं। जावास्क्रिप्ट स्वचालित रूप से स्ट्रिंग वस्तुओं के लिए प्राइमेटिव्स को रूपांतरित करता है, ताकि आदिम स्ट्रिंग्स के लिए स्ट्रिंग ऑब्जेक्ट विधियों का उपयोग करना संभव हो। संदर्भों में जहां एक विधि को एक आदिम स्ट्रिंग पर लागू किया जाना है या एक संपत्ति लुकअप होता है, जावास्क्रिप्ट स्वचालित रूप से स्ट्रिंग आदिम लपेटेगा और विधि को कॉल करेगा या संपत्ति की खोज करेगा।

इसलिए, मैंने सोचा है कि (प्राथमिक रूप से) स्ट्रिंग प्राइमिटिव पर ऑपरेशंस (मेथड कॉल) स्ट्रिंग ऑब्जेक्ट्स पर होने वाले ऑपरेशनों की तुलना में धीमी होनी चाहिए क्योंकि स्ट्रिंग methodपर लागू होने से पहले कोई भी स्ट्रिंग आदिम स्ट्रिंग ऑब्जेक्ट (अतिरिक्त काम) में परिवर्तित हो जाती है ।

लेकिन इस परीक्षण के मामले में , परिणाम विपरीत है। कोड ब्लॉक -1 रन से अधिक तेजी से कोड ब्लॉक -2 , दोनों कोड ब्लॉक नीचे दिए गए हैं:

कोड ब्लॉक -1:

var s = '0123456789';
for (var i = 0; i < s.length; i++) {
  s.charAt(i);
}

कोड ब्लॉक -2:

var s = new String('0123456789');
for (var i = 0; i < s.length; i++) {
    s.charAt(i);
}

परिणाम ब्राउज़र में भिन्न होते हैं लेकिन कोड ब्लॉक -1 हमेशा तेज होता है। किसी को भी इस बारे में समझाएं कर सकते हैं, यही कारण है कि कोड ब्लॉक -1 से अधिक तेजी से है कोड ब्लॉक -2


6
ऑब्जेक्ट रैपिंग new Stringकी एक और पारदर्शी परत का उपयोग करना । typeof new String(); //"object"
पॉल एस।

किस बारे में '0123456789'.charAt(i)?
युरी गैलेन्टर

@YuriyGalanter, यह कोई समस्या नहीं है लेकिन मैं पूछ रहा हूं कि code block-1तेज क्यों है?
अल्फा

2
स्ट्रिंग ऑब्जेक्ट्स को वास्तविक जीवन के संदर्भ में देखा जाना अपेक्षाकृत दुर्लभ है, इसलिए व्याख्याकारों के लिए स्ट्रिंग शाब्दिकों को अनुकूलित करना आश्चर्य की बात नहीं है। आजकल, आपके कोड की केवल व्याख्या नहीं की जाती है , कई अनुकूलन परतें हैं जो पर्दे के पीछे होती हैं।
फेब्रीको मट्टे

2
यह अजीब है: संशोधन 2
hjpotter92

जवाबों:


149

जावास्क्रिप्ट में दो मुख्य प्रकार की श्रेणियां, प्राइमिव और ऑब्जेक्ट हैं।

var s = 'test';
var ss = new String('test');

एकल उद्धरण / डबल उद्धरण पैटर्न कार्यक्षमता के मामले में समान हैं। उस तरफ, जिस व्यवहार को आप नाम देने की कोशिश कर रहे हैं, उसे ऑटो-बॉक्सिंग कहा जाता है। तो वास्तव में क्या होता है कि एक आदिम को उसके आवरण प्रकार में बदल दिया जाता है जब आवरण प्रकार का एक तरीका लागू किया जाता है। सरल रखो:

var s = 'test';

एक आदिम डेटा प्रकार है। इसकी कोई विधियां नहीं हैं, यह एक रॉटर डेटा मेमोरी रेफरेंस के लिए पॉइंटर से ज्यादा कुछ नहीं है, जो बहुत तेज रैंडम एक्सेस स्पीड की व्याख्या करता है।

जब आप s.charAt(i)उदाहरण के लिए करते हैं तो क्या होता है ?

चूँकि जावास्क्रिप्ट sका कोई उदाहरण नहीं है String, इसलिए ऑटो-बॉक्स s, जिसमें typeof stringउसके आवरण प्रकार होते हैं, ठीक या अधिक के Stringसाथ होता है ।typeof objects.valueOf(s).prototype.toString.call = [object String]

ऑटो-बॉक्सिंग व्यवहार sअपने आवरण प्रकार को आवश्यकतानुसार आगे-पीछे करता है, लेकिन मानक ऑपरेशन अविश्वसनीय रूप से तेज़ होते हैं क्योंकि आप एक सरल डेटा प्रकार के साथ काम कर रहे होते हैं। हालांकि ऑटो-बॉक्सिंग और Object.prototype.valueOfअलग - अलग प्रभाव।

यदि आप ऑटो-बॉक्सिंग को बाध्य करना चाहते हैं या इसके आवरण प्रकार के लिए एक आदिम कास्ट करना चाहते हैं, तो आप उपयोग कर सकते हैं Object.prototype.valueOf, लेकिन व्यवहार अलग है। परीक्षण परिदृश्यों की एक विस्तृत विविधता के आधार पर ऑटो-बॉक्सिंग केवल 'आवश्यक' तरीकों को लागू करता है, चर की आदिम प्रकृति को बदलने के बिना। जिसके कारण आपको बेहतर स्पीड मिलती है।


33

यह बल्कि कार्यान्वयन-निर्भर है, लेकिन मैं एक शॉट लूंगा। मैं V8 के साथ अनुकरण करूँगा, लेकिन मुझे लगता है कि अन्य इंजन समान दृष्टिकोण का उपयोग करते हैं।

एक स्ट्रिंग प्रिमिटिव को किसी v8::Stringऑब्जेक्ट पर पार्स किया जाता है । इसलिए, तरीकों को सीधे उस पर लागू किया जा सकता है जैसा कि jfriend00 द्वारा बताया गया है ।

एक स्ट्रिंग ऑब्जेक्ट, दूसरे हाथ में, v8::StringObjectजिस पर विस्तार किया जाता है Objectऔर, एक पूर्ण ऑब्जेक्ट होने के अलावा, के लिए एक आवरण के रूप में कार्य करता है v8::String

अब यह एक फोन केवल तार्किक है, new String('').method()Unbox को यह है v8::StringObject's v8::String, विधि निष्पादित करने से पहले इसलिए यह धीमी है।


कई अन्य भाषाओं में, आदिम मूल्यों के तरीके नहीं हैं।

जिस तरह से एमडीएन डालता है वह यह समझाने का सबसे सरल तरीका है कि कैसे आदिम का ऑटो-बॉक्सिंग काम करता है (जैसा कि फ्लाव के उत्तर में भी उल्लेख किया गया है ), अर्थात, जावास्क्रिप्ट के आदिम-वाई मान कैसे तरीकों को लागू कर सकते हैं।

हालांकि, एक स्मार्ट इंजन एक स्ट्रिंग प्राइमिटिव-वाई को स्ट्रिंग ऑब्जेक्ट में परिवर्तित नहीं करेगा, जब भी आपको किसी विधि को कॉल करने की आवश्यकता होती है। यह एनोटेट ईएस 5 कल्पना में भी जानकारीपूर्ण रूप से उल्लिखित है आदिम मूल्यों के गुणों (और "विधियों" of) के संबंध में:

नोट जो ऑब्जेक्ट चरण 1 में बनाया जा सकता है वह उपरोक्त विधि के बाहर पहुँच योग्य नहीं है। एक कार्यान्वयन वस्तु के वास्तविक निर्माण से बचने के लिए चुन सकता है। [...]

बहुत निचले स्तर पर, स्ट्रिंग्स को अक्सर अपरिवर्तनीय स्केलर मानों के रूप में लागू किया जाता है। उदाहरण आवरण संरचना:

StringObject > String (> ...) > char[]

आप आदिम से जितना दूर होंगे, उसे पाने में उतना ही अधिक समय लगेगा। व्यवहार में, Stringप्राइमेटिव्स StringObjectएस की तुलना में बहुत अधिक बार होते हैं , इसलिए इंजनों के लिए स्ट्रिंग प्राइमैटिक्स के अनुरूप (व्याख्यायित) ऑब्जेक्ट्स क्लास में तरीकों को जोड़ना आसान नहीं है, बजाय एमडीएन के स्पष्टीकरण के बीच Stringऔर पीछे के StringObjectरूप में परिवर्तित करने के बजाय ।


Aming जावास्क्रिप्ट में, "मेथड" केवल एक संपत्ति के लिए एक नामकरण सम्मेलन है जो प्रकार फ़ंक्शन के मान के लिए हल होता है।


1
आपका स्वागत है। =]अब मैं सोच रहा हूं कि क्या एमडीएन की व्याख्या सिर्फ इसलिए है क्योंकि यह ऑटो-बॉक्सिंग को समझने का सबसे आसान तरीका है या फिर ईएस कल्पना में इसका कोई संदर्भ है या नहीं .. इस पर जांच के दौरान पूरे समय तक पढ़ना, याद रहेगा। यदि मुझे कभी कोई संदर्भ मिले तो उत्तर को अपडेट करें।
फेब्रीको मट्टे

V8 के कार्यान्वयन में महान अंतर्दृष्टि। मुझे लगता है कि बॉक्सिंग समारोह को हल करने के लिए नहीं है। यह इस संदर्भ में विधि में पारित करने के लिए भी है। अब मुझे यकीन नहीं है कि क्या V8 बिल्ट-इन तरीकों के लिए इसे छोड़ता है, लेकिन अगर आप String.prototyp कहने के लिए अपना खुद का एक्सटेंशन जोड़ते हैं, तो आपको हर बार इसे कॉल किए जाने वाले स्ट्रिंग ऑब्जेक्ट का एक बॉक्सेड संस्करण मिलेगा।
बेन

17

स्ट्रिंग शाब्दिक के मामले में हम गुण प्रदान नहीं कर सकते

var x = "hello" ;
x.y = "world";
console.log(x.y); // this will print undefined

जबकि स्ट्रिंग ऑब्जेक्ट के मामले में हम प्रॉपर्टी असाइन कर सकते हैं

var x = new String("hello");
x.y = "world";
console.log(x.y); // this will print world

1
अंत में कोई हमें प्रेरित करता है कि हमें Stringवस्तुओं की आवश्यकता क्यों है । धन्यवाद!
साइप्रियन टोमोयागॉ

1
किसी को ऐसा करने की आवश्यकता क्यों होगी?
आदित्य

11

शाब्दिक स्ट्रिंग:

स्ट्रिंग शाब्दिक अपरिवर्तनीय हैं, जिसका अर्थ है, एक बार बनने के बाद, उनकी स्थिति को बदला नहीं जा सकता है, जो उन्हें थ्रेड को सुरक्षित बनाता है।

var a = 's';
var b = 's';

a==b परिणाम 'सत्य' होगा, दोनों स्ट्रिंग संदर्भ समान वस्तु हैं।

स्ट्रिंग ऑब्जेक्ट:

यहां, दो अलग-अलग ऑब्जेक्ट बनाए गए हैं, और उनके अलग-अलग संदर्भ हैं:

var a = new String("s");
var b = new String("s");

a==b परिणाम गलत होगा, क्योंकि उनके अलग-अलग संदर्भ हैं।


1
क्या स्ट्रिंग ऑब्जेक्ट अपरिवर्तनीय है?
यांग वांग

@YangWang एक मूर्खतापूर्ण भाषा है कि, दोनों के लिए aऔर bआवंटित करने के लिए कोशिश a[0] = 'X'यह होगी सफलतापूर्वक क्रियान्वित किया लेकिन काम नहीं आप उम्मीद कर सकते के रूप में होगा
RUX

आपने "var a = 's' लिखा है; var b = 's'; a == b परिणाम 'स्ट्रिंग' के समान ऑब्जेक्ट का 'सही' होगा।" यह सही नहीं है: ए और बी किसी भी एक ही वस्तु को संदर्भित नहीं करते हैं, परिणाम सही है क्योंकि उनके समान मूल्य हैं। उन मानों को अलग-अलग मेमोरी स्थानों में संग्रहीत किया जाता है, इसीलिए यदि आप एक को बदलते हैं तो दूसरा नहीं बदलता है!
SC1000 8

9

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

typeof new String(); // "object"
typeof '';           // "string"

जैसा कि वे विभिन्न प्रकार के हैं, आपका जावास्क्रिप्ट दुभाषिया भी उन्हें अलग तरह से अनुकूलित कर सकता है, जैसा कि टिप्पणियों में उल्लेख किया गया है


5

जब आप घोषणा करते हैं:

var s = '0123456789';

आप एक स्ट्रिंग आदिम बनाते हैं। उस स्ट्रिंग आदिम में ऐसी विधियाँ होती हैं जो आपको प्रथम श्रेणी की वस्तु के रूप में आदिम को परिवर्तित किए बिना उस पर तरीके बताती हैं। तो आपका तर्क है कि यह धीमा होगा क्योंकि स्ट्रिंग को ऑब्जेक्ट में बदलना होगा, यह सही नहीं है। इसे किसी वस्तु में बदलना नहीं है। आदिम स्वयं तरीकों को लागू कर सकता है।

इसे एक पूर्ण विकसित वस्तु में परिवर्तित करना (जो आपको इसमें नई संपत्तियाँ जोड़ने की अनुमति देता है) एक अतिरिक्त कदम है और यह तार के ओप्रेशन को तेज़ नहीं बनाता है (वास्तव में आपका परीक्षण दिखाता है कि यह उन्हें धीमा बनाता है)।


कैसे कस्टम आदि सहित सभी प्रोटोटाइप गुणों को स्ट्रिंग आदिम विरासत में मिला String.prototypeहै?
युरी गैलेन्टर

1
var s = '0123456789';एक आदिम मूल्य है, इस मूल्य के तरीके कैसे हो सकते हैं, मैं भ्रमित हूँ!
अल्फा

2
@ शेखहेरा - आदिम भाषा के कार्यान्वयन में बनाया गया है ताकि दुभाषिया उन्हें विशेष अधिकार दे सकें।
jfriend00

1
@ शेखहेरा - मैं आपकी पिछली टिप्पणी / प्रश्न को नहीं समझता। स्वयं द्वारा एक स्ट्रिंग आदिम आपको अपने स्वयं के गुणों को इसमें जोड़ने का समर्थन नहीं करता है। इसकी अनुमति देने के लिए, जावास्क्रिप्ट में एक स्ट्रिंग ऑब्जेक्ट भी होता है, जिसमें एक स्ट्रिंग आदिम के समान सभी विधियां होती हैं, लेकिन एक पूर्ण विकसित वस्तु है जिसे आप सभी तरीकों से किसी वस्तु की तरह व्यवहार कर सकते हैं। यह दोहरा रूप थोड़ा गड़बड़ प्रतीत होता है, लेकिन मुझे संदेह है कि यह एक प्रदर्शन समझौता के रूप में किया गया था क्योंकि 99% मामला प्राइमिटिव्स का उपयोग है और वे शायद स्ट्रिंग ऑब्जेक्ट्स की तुलना में तेज और अधिक मेमोरी कुशल हो सकते हैं।
jfriend00

1
@ शेखहेरा "स्ट्रिंग ऑब्जेक्ट में परिवर्तित" है कि कैसे एमडीएन यह बताने के लिए व्यक्त करता है कि कैसे आदिम तरीकों को लागू करने में सक्षम हैं। वे सचमुच स्ट्रिंग ऑब्जेक्ट्स में परिवर्तित नहीं होते हैं।
फेब्रीको मट्टे

4

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

मूल रूप से दोनों के बीच एक और अंतर है, जब eval का उपयोग किया जाता है। eval ('1 + 1') 2 देता है, जबकि eval (नया स्ट्रिंग ('1 + 1')) '1 + 1' देता है, इसलिए यदि कोड के कुछ ब्लॉक को 'सामान्य रूप से' या eval दोनों के साथ निष्पादित किया जा सकता है, तो यह हो सकता है अजीब परिणाम के लिए नेतृत्व


आपके इनपुट के लिए धन्यवाद :-)
अल्फा

वाह, यह वास्तव में कुछ अजीब व्यवहार है। इस व्यवहार को दिखाने के लिए आपको अपनी टिप्पणी में एक छोटा सा इन-लाइन डेमो जोड़ना चाहिए - यह बेहद आंख खोलने वाला है।
आईयूएलडीके

यदि आप इसके बारे में सोचते हैं तो यह सामान्य है। new String("")एक वस्तु लौटाएं, और केवल स्ट्रिंग का मूल्यांकन करें, एट हर चीज को वापस करें जैसा कि यह है
फेलेक्स ब्रूनेट

3

एक वस्तु के अस्तित्व का ईसीएमएस्क्रिप्ट / जावास्क्रिप्ट इंजन में एक स्ट्रिंग के वास्तविक व्यवहार के साथ बहुत कम संबंध है, क्योंकि रूट स्कोप में बस इसके लिए फ़ंक्शन ऑब्जेक्ट होंगे। तो एक स्ट्रिंग शाब्दिक के मामले में charAt (int) फ़ंक्शन को खोजा और निष्पादित किया जाएगा।

एक वास्तविक वस्तु के साथ आप एक और परत जोड़ते हैं जहाँ charAt (int) विधि भी मानक व्यवहार के ऊपर (समान रूप से) किक करने से पहले वस्तु पर ही खोजी जाती है। स्पष्ट रूप से इस मामले में आश्चर्यजनक रूप से बड़ी मात्रा में काम किया जाता है।

BTW मुझे नहीं लगता है कि वास्तव में आदिम वस्तुएं वस्तुओं में परिवर्तित हो जाती हैं, लेकिन स्क्रिप्ट इंजन इस चर को स्ट्रिंग प्रकार के रूप में चिह्नित करेगा और इसलिए यह इसके लिए सभी प्रदान किए गए कार्यों को पा सकता है, इसलिए ऐसा लगता है कि आप किसी ऑब्जेक्ट को आमंत्रित करते हैं। मत भूलना यह एक स्क्रिप्ट रनटाइम है जो OO रनटाइम की तुलना में विभिन्न सिद्धांतों पर काम करता है।


3

एक स्ट्रिंग आदिम और एक स्ट्रिंग ऑब्जेक्ट के बीच सबसे बड़ा अंतर यह है कि ऑब्जेक्ट को ऑपरेटर के लिए इस नियम== का पालन करना चाहिए :

ऑब्जेक्ट्स की तुलना करने वाला एक अभिव्यक्ति केवल तभी सच है जब ऑपरेंड समान ऑब्जेक्ट का संदर्भ देते हैं।

इसलिए, जबकि स्ट्रिंग प्राइमेटिव्स में एक सुविधाजनक ==है जो मूल्य की तुलना करता है, आप भाग्य से बाहर हैं जब यह किसी अन्य अपरिवर्तनीय वस्तु प्रकार (एक स्ट्रिंग ऑब्जेक्ट सहित) को एक मूल्य प्रकार की तरह व्यवहार करने की बात आती है।

"hello" == "hello"
-> true
new String("hello") == new String("hello") // beware!
-> false

(अन्य लोगों ने उल्लेख किया है कि एक स्ट्रिंग ऑब्जेक्ट तकनीकी रूप से उत्परिवर्तनीय है क्योंकि आप इसमें गुण जोड़ सकते हैं। लेकिन यह स्पष्ट नहीं है कि यह किस लिए उपयोगी है; स्ट्रिंग मान स्वयं ही उपलब्ध नहीं है।)


काफी लंबे समय के बाद सवाल के लिए मूल्य जोड़ने के लिए धन्यवाद :-)
अल्फा

1

जावास्क्रिप्ट इंजन द्वारा चलने से पहले कोड को अनुकूलित किया गया है। सामान्य तौर पर, माइक्रो बेंचमार्क भ्रामक हो सकते हैं क्योंकि कंपाइलर और दुभाषिए आपके कोड के अन्य हिस्सों को फिर से चलाने, संशोधित करने, हटाने और प्रदर्शन करने के लिए इसे तेज करते हैं। दूसरे शब्दों में, लिखित कोड बताता है कि लक्ष्य क्या है लेकिन संकलक और / या रनटाइम तय करेगा कि उस लक्ष्य को कैसे प्राप्त किया जाए।

ब्लॉक 1 मुख्य रूप से तेजी से होता है: var s = '0123456789'; हमेशा var s = new String ('0123456789') से अधिक तेज़ होता है; वस्तु निर्माण की अधिकता के कारण।

लूप वाला हिस्सा मंदी का कारण नहीं है, क्योंकि इंटरप्रेटर द्वारा चार्टएट () को इनलाइन किया जा सकता है। लूप को हटाने की कोशिश करें और परीक्षण को फिर से चलाएँ, आप देखेंगे कि गति अनुपात उसी तरह होगा जैसे कि लूप को हटाया नहीं गया था। दूसरे शब्दों में, इन परीक्षणों के लिए, निष्पादन समय पर लूप ब्लॉक में बिल्टकोड / मशीन कोड समान होता है।

इस प्रकार के माइक्रो बेंचमार्क के लिए, बायटेकोड या मशीन कोड wil को देखकर एक स्पष्ट तस्वीर प्रदान करते हैं।


1
आपके उत्तर के लिए धन्यवाद।
अल्फा

0

जावास्क्रिप्ट में, आदिम डेटा प्रकार जैसे स्ट्रिंग एक गैर-संयुक्त बिल्डिंग ब्लॉक है। इसका मतलब यह है कि वे सिर्फ मूल्य हैं, और कुछ नहीं: let a = "string value"; डिफ़ॉल्ट रूप से कोई अंतर्निहित तरीके जैसे कि टॉपरकैसे, टोलोवरेज़ आदि ...

लेकिन, अगर आप लिखने की कोशिश करते हैं:

console.log( a.toUpperCase() ); or console.log( a.toLowerCase() );

इससे कोई त्रुटि नहीं होगी, इसके बजाय वे काम करेंगे जैसा कि उन्हें करना चाहिए।

क्या हुआ ? ठीक है, जब आप एक स्ट्रिंग की एक संपत्ति का उपयोग करने की कोशिश करते हैं aजावास्क्रिप्ट आवरण को ऑब्जेक्टnew String(a); को आवरण ऑब्जेक्ट के रूप में जाना जाता है ।

यह प्रक्रिया जावास्क्रिप्ट में फ़ंक्शन कंस्ट्रक्टर्स नामक अवधारणा से जुड़ी हुई है , जहां नई वस्तुओं को बनाने के लिए फ़ंक्शंस का उपयोग किया जाता है।

जब आप टाइप new String('String value');यहाँ स्ट्रिंग समारोह निर्माता है, जो एक तर्क लेता है और समारोह दायरे के अंदर एक खाली वस्तु बनाता है, इस खाली वस्तु को सौंपा गया है है इस और इस मामले में, स्ट्रिंग सभी कार्यों हम पहले उल्लेख किया है में बनाया जाना जाता है उन आपूर्ति करती है। और जैसे ही ऑपरेशन पूरा होता है, उदाहरण के लिए अपरकेस ऑपरेशन करते हैं, रैपर ऑब्जेक्ट को छोड़ दिया जाता है।

यह साबित करने के लिए, आइए यह करें:

let justString = 'Hello From String Value';
justString.addNewProperty = 'Added New Property';
console.log( justString );

यहां आउटपुट अपरिभाषित होगा। क्यों ? इस स्थिति में जावास्क्रिप्ट आवरण आवरण स्ट्रिंग ऑब्जेक्ट बनाता है, नई संपत्ति addNewProperty सेट करता है और आवरण ऑब्जेक्ट को तुरंत हटा देता है। यही कारण है कि आप अपरिभाषित हो जाते हैं। छद्म कोड इस तरह दिखेगा:

let justString = 'Hello From String Value';
let wrapperObject = new String( justString );
wrapperObject.addNewProperty = 'Added New Property'; //Do operation and discard

0

हम स्ट्रिंग को 3-तरीकों से परिभाषित कर सकते हैं

  1. var a = "पहला तरीका";
  2. var b = स्ट्रिंग ("दूसरा तरीका");
  3. var c = नया स्ट्रिंग ("तीसरा तरीका");

// हम भी 4. var d = a + '' का उपयोग करके बना सकते हैं;

टाइपो ऑपरेटर का उपयोग करके बनाए गए तार के प्रकार की जांच करें

  • टाइपो ए // "स्ट्रिंग"
  • टाइपोफ़ बी // "स्ट्रिंग"
  • टाइपोफ़ c // "ऑब्जेक्ट"


जब आप a और b var की तुलना करते हैं a==b ( // yes)


जब आप स्ट्रिंग वस्तु की तुलना करते हैं

var StringObj = new String("third way")
var StringObj2 = new String("third way")
StringObj  == StringObj2 // no result will be false, because they have different references
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.