जावास्क्रिप्ट में स्ट्रिंग करने के लिए कास्टिंग


184

मुझे Stringजावास्क्रिप्ट में एक चर डालने के तीन तरीके मिले ।
मैंने jQuery स्रोत कोड में उन तीन विकल्पों की खोज की, और वे सभी उपयोग में हैं
मैं जानना चाहूंगा कि क्या उनके बीच कोई मतभेद हैं:

value.toString()
String(value)
value + ""

डेमो

वे सभी एक ही आउटपुट का उत्पादन करते हैं, लेकिन क्या उनमें से एक दूसरों की तुलना में बेहतर है?
मैं कहूंगा कि + ""इसका एक फायदा है कि यह कुछ पात्रों को बचाता है, लेकिन यह उतना बड़ा लाभ नहीं है, और कुछ है?


1
मुझे लगता है कि अगर सभी चीजें समान हैं, तो मानक toString()जाने का रास्ता होगा।
असावर

1
@asawyer। और यही वजह है कि? यदि वे सभी एक ही आउटपुट का उत्पादन करते हैं और एक ही करते हैं, तो एक को चुनें और उसके साथ जाएं। अगर वास्तव में यहाँ ऐसा है तो यह मेरी राय है
गदोरन

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

6
मेरी राय में toString, इस बात को स्पष्ट करने का सबसे स्पष्ट तरीका है कि आप किसी वस्तु के बराबर स्ट्रिंग प्राप्त करने का प्रयास कर रहे हैं। String(...)एक छोटा सा obtuse है, और value + ""एक हैक का एक सा है। यह आपको toStringएक कस्टम कार्यान्वयन के साथ डिफ़ॉल्ट को ओवरराइड करने की क्षमता भी देता है यदि आपको कभी भी लगता है कि मुझे मामूली लाभ के रूप में इसकी आवश्यकता है।
asawyer

2
@Adriano। लेकिन + ""jsperf के अनुसार सबसे तेज़ है, इसलिए ... यह मुझे लगता है कि किसी और तरीके से नी करता है।
gdoron

जवाबों:


212

वे अलग व्यवहार करते हैं जब valueहै null

  • null.toString()एक त्रुटि फेंकता है - अशक्त की विधि 'कॉलिंग' नहीं कर सकता
  • String(null)रिटर्न - "अशक्त"
  • null + ""भी लौटता है - "अशक्त"

बहुत ही समान व्यवहार होता है यदि valueहै undefined(देखें jbabey का उत्तर )।

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


यह वास्तव में एक दिलचस्प अंतर है। इसलिए toString()जब आपको nullअभी तक जाँच नहीं करनी है तो आपको इसका इस्तेमाल करने से बचना चाहिए ।
सैमी एस।

@SammyS। पता नहीं अगर मुद्रण nullया undefinedस्क्रीन एक अधिक वांछनीय व्यवहार है तो एक जावास्क्रिप्ट त्रुटि ...
जस्टस रोमिजन

@JustusRomijn: सच में। इस बीच, मैंने ऐसी त्रुटियों को संभालने के लिए विकल्प प्रकार का उपयोग करना शुरू कर दिया।
सैमी एस।

आप स्ट्रिंग के लिए जाँच करने के लिए टाइपोफ के साथ इनमें से किसी भी प्रकार के चर की जाँच कर सकते हैं। typeof (null + '') == 'string'
ब्रूस लिम

4
एक और मामला है जब वे अलग व्यवहार करते हैं। v + ''यदि v में toString () और valueOf () विधियाँ हैं तो गलत परिणाम देता है। कॉन्टेक्टेशन स्ट्रैसिंग () को अनदेखा करेगा और वैल्यूऑफ () का उपयोग करेगा। एक ऐसे वर्ग का उदाहरण जिसके लिए
सहमति

26

मतभेद हैं, लेकिन वे शायद आपके प्रश्न के लिए प्रासंगिक नहीं हैं। उदाहरण के लिए, स्ट्रीपिंग प्रोटोटाइप अपरिभाषित चर पर मौजूद नहीं है, लेकिन आप अन्य दो विधियों का उपयोग करके एक स्ट्रिंग को अपरिभाषित कर सकते हैं:

var foo;

var myString1 = String(foo); // "undefined" as a string

var myString2 = foo + ''; // "undefined" as a string

var myString3 = foo.toString(); // throws an exception

http://jsfiddle.net/f8YwA/


3
यदि कोई चर बिल्कुल परिभाषित नहीं है, तो भी आपको एक त्रुटि मिलेगी String()। उदाहरण: String(test);फेंकता है Uncaught ReferenceError: test is not defined, जबकि var test; String(test);परिणाम होगा "undefined"
एंथनी

17

वे समान व्यवहार करते हैं, लेकिन toStringएक नंबर बाइनरी, ऑक्टल या हेक्साडेसिमल स्ट्रिंग्स को परिवर्तित करने का एक तरीका भी प्रदान करते हैं:

उदाहरण:

var a = (50274).toString(16)  // "c462"
var b = (76).toString(8)      // "114"
var c = (7623).toString(36)   // "5vr"
var d = (100).toString(2)     // "1100100"

9

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

पूर्णता के लिए: के रूप में asawyer पहले ही उल्लेख किया, आप भी उपयोग कर सकते हैं .toString()विधि।


2
उस jsperf का दो बार एक ही परीक्षण होता है, मैंने इसे संपादित किया और new String()एक वस्तु नहीं लौटाताString
gdoron, Monica

new String()किसी वस्तु को हाँ देता है। String()हालांकि, एक स्ट्रिंग लौटाता है, जो प्रश्न में एक है।
कॉननेल

2
यह पूरी तरह से सच नहीं है। जैसा कि आप परिणामों से देख सकते हैं, एक रिक्त स्ट्रिंग और एक वस्तु को समेटना एक वस्तु और एक रिक्त स्ट्रिंग को समेटने के समान परिणाम नहीं देता है। इसके अलावा, new String(blarg)आपको एक Stringवस्तु देता है जिस toString()पर आप कॉल कर सकते हैं । मेरे Chrome डीबगर में, वे प्रभावी रूप से उसी प्रकार की वस्तु को परिणामित करते हैं, जिसमें अंतर कहा गया है।
सैमी एस।

@SammyS। क्या आप कृपया अपने उत्तर में उदाहरण प्रदर्शन परिणाम जोड़ सकते हैं? Jsperf लिंक वर्तमान में नीचे है और निश्चित रूप से अगले 5+ वर्षों में फिर से होगा।
mxmlnkn

9

उपरोक्त सभी के अलावा, एक को परिभाषित मूल्य के लिए, ध्यान देना चाहिए v:

  • String(v) कॉल v.toString()
  • '' + vv.valueOf()किसी अन्य प्रकार के कॉल से पहले कॉल करें

तो हम कुछ ऐसा कर सकते हैं:

var mixin = {
  valueOf:  function () { return false },
  toString: function () { return 'true' }
};
mixin === false;  // false
mixin == false;    // true
'' + mixin;       // "false"
String(mixin)     // "true"

एफएफ 34.0 और नोड 0.10 में परीक्षण किया गया


8

यदि आप अशक्त, अपरिभाषित, NaN, 0 के साथ ठीक हैं, और सभी कास्टिंग '' के लिए गलत है, तो (s ? s+'' : '')तेज है।

http://jsperf.com/cast-to-string/8 देखें

नोट - इस समय ब्राउज़र में महत्वपूर्ण अंतर हैं।


4

वास्तविक दुनिया का उदाहरण: मुझे एक लॉग फ़ंक्शन मिला है जिसे एक अनियंत्रित मापदंडों के साथ कहा जा सकता है log("foo is {} and bar is {}", param1, param2):। यदि कोई DEBUGध्वज सेट किया गया है true, तो ब्रैकेट को दिए गए मापदंडों से बदल दिया जाता है और स्ट्रिंग को पास कर दिया जाता है console.log(msg)। पैरामीटर्स स्ट्रिंग्स, नंबर और जो भी JSON / AJAX कॉल द्वारा वापस आ सकते हैं, हो सकते हैं null

  • arguments[i].toString()संभावित nullमूल्यों के कारण एक विकल्प नहीं है (कॉनेल वाटकिंस का जवाब देखें)
  • JSLint के बारे में शिकायत करेंगे arguments[i] + ""। यह किसी निर्णय को प्रभावित नहीं कर सकता है कि क्या उपयोग करना है। कुछ लोग JSLint का सख्ती से पालन करते हैं।
  • कुछ ब्राउज़रों में, स्ट्रिंग फ़ंक्शन या स्ट्रिंग कंस्ट्रक्टर का उपयोग करने की तुलना में खाली तारों को संक्षिप्त करना बहुत तेज़ है (देखें सैमएसएस एस उत्तर में JSPerf परीक्षण)। ओपेरा 12 और फ़ायरफ़ॉक्स 19 में, खाली तारों को संक्षिप्त रूप से तेज़ी से (फ़ायरफ़ॉक्स 19 में 95%) - या कम से कम जेएसपीएफ ऐसा कहता है।

1

इस पृष्ठ पर आप प्रत्येक विधि के प्रदर्शन का परीक्षण स्वयं कर सकते हैं :)

http://jsperf.com/cast-to-string/2

यहाँ, सभी मशीनों और ब्राउज़रों पर, "" + str 'सबसे तेज़ है, (String) str सबसे धीमा है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.