जवाबों:
वे पूरी तरह से समान नहीं हैं, और वास्तव में, स्ट्रिंग निर्माता को एक फ़ंक्शन (आपका पहला उदाहरण) के रूप में कहा जाता है , अंत में, 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- स्ट्रिंग से परिवर्तित किया जाता है , तो निम्न कदम उठाए जाते हैं:
toStringविधि निष्पादित करें ।
resultएक आदिम है , तो लौटें result, अन्यथा चरण 2 पर जाएं।valueOfविधि निष्पादित करें ।
resultएक आदिम है , तो लौटें result, अन्यथा चरण 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आंतरिक संचालन।
मैं भी इस लेख को पढ़ने की सलाह देता हूं:
new String({toString: null})ने फेंका ए TypeError।
String()और + ''अब एक काफी महत्वपूर्ण अंतर है। String(Symbol())चलेगा, लेकिन Symbol() + ''एक त्रुटि (और प्रतीक) (एक अशक्त गार्ड को पारित कर देगा, अशक्त और अपरिभाषित के विपरीत, इसलिए x && (x + '')अब फेंक सकता है)।
value.toString()valueअशक्त होने पर त्रुटि उत्पन्न होगी । String(value)नहीं चाहिए।
उदाहरण के लिए:
var value = null;
alert(value.toString());
क्योंकि असफल हो जायेगी value == null।
var value = null;
alert(String(value));
"नल" (या समान) पढ़ने वाला एक संदेश प्रदर्शित करना चाहिए, लेकिन यह दुर्घटनाग्रस्त नहीं होगा।
स्ट्रिंग () [ कंस्ट्रक्टर कॉल ] मूल रूप से .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 () ऑब्जेक्ट के अंदर परिभाषित किया जाएगा जिसे हम ऑब्जेक्ट को स्ट्रिंग के रूप में या संख्या के रूप में हैंडल करना चाहते हैं
new String(value)किसी भी मूल्य पर, यह हमेशा एक स्ट्रिंग ऑब्जेक्ट लौटाएगा।