2010-07-14 19 views
5

की विरासत शायद यह प्रश्न आसान है, लेकिन अब मैं समझ नहीं पा रहा हूं।जावास्क्रिप्ट

String.prototype.self=function() 
{ 
    return this; 
} 
var s="s"; 

alert("s".self()=="s".self()) //false; 
alert(s.self()==s.self()) //false; 

यदि आपको कारण पता है, तो कृपया मुझे बताएं कि परिणाम "झूठा" क्यों है।

उत्तर

8

क्योंकि जब एक संपत्ति जैसे "s", एक आदिम मूल्य तक पहुँच जाता है, property accesors वह आंतरिक रूप से ToObject मजबूर, और तुलना में विफल रहता है, क्योंकि यह दो अलग अलग वस्तु संदर्भ की जाँच करता है है यही कारण है कि।

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

new String("s") == new String("s"); // false 
+0

दूसरे उदाहरण क्यों असफल करता है:

String.prototype.test = function() { return typeof this; } "s".test(); // "object" 

यह तुलना करने की तरह है? –

+2

@ अभिव्यक्ति में आलेख 's.self() == s.self() ',' s' चर में निहित मान को दो बार' ToObject' को मजबूर किया जाता है, क्योंकि 's' में एक आदिम होता है, जब बिंदु ('.') संपत्ति एक्सेसर का उपयोग किया जाता है, 'स्ट्रिंग.प्रोटोटाइप' सदस्यों तक पहुंचने में सक्षम होने के लिए ऑब्जेक्ट को मजबूर किया जाता है। तुलना लगभग 'var s =' s के बराबर होगी; नई स्ट्रिंग (ओं) == नई स्ट्रिंग; 'जो' झूठी 'भी उत्पन्न करती है। – CMS

+1

@ ग्रामैन शब्द शर्तों में, हालांकि दोनों स्ट्रिंग ऑब्जेक्ट्स में एक ही डेटा होता है, वे अलग-अलग वस्तुएं हैं, और इस प्रकार == झूठी हैं। – Stephen