स्ट्रिंग (मान) बनाम मान के बीच अंतर क्या है। स्ट्रींग ()


104

जावास्क्रिप्ट में बहुत सारे प्रकार के "ट्रिक्स" हैं और प्रकार रूपांतरण हैं इसलिए मैं सोच रहा हूं कि क्या ये 2 तरीके समान हैं या यदि कोई कोने का मामला है जो उन्हें अलग बनाता है?

जवाबों:


121

वे पूरी तरह से समान नहीं हैं, और वास्तव में, स्ट्रिंग निर्माता को एक फ़ंक्शन (आपका पहला उदाहरण) के रूप में कहा जाता है , अंत में, toStringउदाहरण के लिए, पारित की गई वस्तु की विधि को कॉल करेगा :

var o = { toString: function () { return "foo"; } };
String(o); // "foo"

दूसरी ओर, एक पहचानकर्ता के लिए संदर्भित करता है, तो nullया undefined, आप उपयोग नहीं कर सकते toStringविधि, तो यह आपको एक दे देंगे TypeErrorअपवाद :

var value = null;
String(null);     // "null"
value.toString(); // TypeError

Stringनिर्माता एक समारोह के रूप नामक लगभग के बराबर होगा:

value + '';

ऑब्जेक्ट- प्रकार- आदिम से प्रकार रूपांतरण नियम विस्तृत विवरण पर वर्णित हैं, [[DefaultValue]]आंतरिक ऑपरेशन।

संक्षेप में संक्षेप में, जब ऑब्जेक्ट -to- स्ट्रिंग से परिवर्तित किया जाता है , तो निम्न कदम उठाए जाते हैं:

  1. यदि उपलब्ध हो, तो toStringविधि निष्पादित करें ।
    • यदि resultएक आदिम है , तो लौटें result, अन्यथा चरण 2 पर जाएं।
  2. यदि उपलब्ध हो, तो valueOfविधि निष्पादित करें ।
    • यदि resultएक आदिम है , तो लौटें result, अन्यथा चरण 3 पर जाएं।
  3. फेंक देते हैं TypeError

उपरोक्त नियमों को देखते हुए, हम इसमें शामिल शब्दार्थ का एक उदाहरण बना सकते हैं:

var o = {
  toString: function () { return "foo"; },
  valueOf:  function () { return "bar"; }
};

String(o); // "foo"

// Make the toString method unavailable:
o.toString = null;

String(o); // "bar"

// Also make the valueOf method unavailable:
o.valueOf = null;

try { 
  String(o); 
} catch (e) {
  alert(e); // TypeError
}

आप इस तंत्र मैं देखने की सलाह देते हैं के बारे में अधिक जानना चाहते हैं ToPrimitiveऔर ToStringआंतरिक संचालन।

मैं भी इस लेख को पढ़ने की सलाह देता हूं:


1
एक तीसरा "तरीका" है, यदि आप इसे कहते हैं: new String(value)किसी भी मूल्य पर, यह हमेशा एक स्ट्रिंग ऑब्जेक्ट लौटाएगा।
हर्बर्टुज

@ हेरबर्टस new String({toString: null})ने फेंका ए TypeError
Константин Ван

प्रतीकों के अलावा String()और + ''अब एक काफी महत्वपूर्ण अंतर है। String(Symbol())चलेगा, लेकिन Symbol() + ''एक त्रुटि (और प्रतीक) (एक अशक्त गार्ड को पारित कर देगा, अशक्त और अपरिभाषित के विपरीत, इसलिए x && (x + '')अब फेंक सकता है)।
14

24

value.toString()valueअशक्त होने पर त्रुटि उत्पन्न होगी । String(value)नहीं चाहिए।

उदाहरण के लिए:

var value = null;
alert(value.toString());

क्योंकि असफल हो जायेगी value == null

var value = null;
alert(String(value));

"नल" (या समान) पढ़ने वाला एक संदेश प्रदर्शित करना चाहिए, लेकिन यह दुर्घटनाग्रस्त नहीं होगा।


3
मैंने जावास्क्रिप्ट में एक शून्य सूचक अपवाद कभी नहीं देखा है ... आपने वह कहाँ देखा था?
डग नबबिट

अच्छा। यह अभी भी एक उदाहरण के साथ अच्छा होगा
mykhal

@ नहीं, @casablanca फिक्स्ड। मैं जावा का आदी हूँ। @mykhal वह कैसा दिखता है?
जोनाथन

यह एक स्ट्रिंग "अशक्त" देता है :)
moefinley

1

String(value)value.toString()प्रत्येक मामले में समान परिणाम होना चाहिए , जैसे गुणों के बिना मानों को छोड़कर nullया undefined''+valueउसी परिणाम का उत्पादन करेगा।


1

स्ट्रिंग () [ कंस्ट्रक्टर कॉल ] मूल रूप से .toString () कॉल कर रहा है

.toString () और स्ट्रिंग () को आदिम मूल्यों (संख्या, बूलियन, स्ट्रिंग) पर बुलाया जा सकता है और मूल रूप से कुछ भी विशेष नहीं होगा:

सत्य => 'सत्य'

झूठी => 'झूठी'

17 => '17'

'हैलो' => 'हैलो'

लेकिन इन कार्यों को वस्तुओं पर कॉल करना, जहां चीजें दिलचस्प होती हैं:

यदि ऑब्जेक्ट का अपना है .toString () फ़ंक्शन तब इसे कॉल किया जाएगा जब आपको कभी भी इस ऑब्जेक्ट को स्ट्रिंग (स्पष्ट रूप से / स्पष्ट रूप से) के रूप में माना जाना चाहिए।

let obj = {
           myName:"some object",
           toString:function(){ return this.myName; } 
          }

//implicitly treating this obj as a string
"hello " + obj; //"hello some object"

//OR (explicitly)
"hello " + String(obj) //calling the existent toString function

//OR
"hello " + obj.toString(); //calling toString directly

वैसे यदि आप इस ऑब्जेक्ट को एक संख्या के रूप में मानना चाहते हैं, तो इसमें एक .valueOf () फ़ंक्शन परिभाषित होना चाहिए ।

क्या होगा अगर हम दोनों एक वस्तु में हैं?

अगर हम इस वस्तु को एक स्ट्रिंग के रूप में व्यवहार करना चाहते हैं => .toString () का उपयोग करें

अगर हम इस वस्तु को संख्या => उपयोग के रूप में मानना ​​चाहते हैं।

क्या होगा यदि हमारे पास केवल .valueOf () परिभाषित हो?

.valueOf () ऑब्जेक्ट के अंदर परिभाषित किया जाएगा जिसे हम ऑब्जेक्ट को स्ट्रिंग के रूप में या संख्या के रूप में हैंडल करना चाहते हैं

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