2011-12-20 15 views
15

क्या कोई निम्नलिखित को समझा सकता है?इंस्टेंस ऑफ असंगतता

[] instanceof Array; // true 
'' instanceof String; // false 
+1

इसके अलावा 'टाइपोफ़ "" '' '" स्ट्रिंग "' और' टाइपऑफ [] '' "ऑब्जेक्ट" है (आप 'सरणी "की उम्मीद करेंगे लेकिन ठीक है, मैं इसके साथ रह सकता हूं) – Halcyon

+0

अनुमान लगाना, क्या 'एक आदिम हो, लेकिन [] एक वस्तु? –

+2

+1 दिलचस्प, क्योंकि '" ".constructor === स्ट्रिंग'। – pimvdb

उत्तर

14

नोट निम्नलिखित:

"" instanceof String;    // => false 
new String("") instanceof String; // => true 

instanceof एक वस्तु की आवश्यकता है, लेकिन "" एक स्ट्रिंग शाब्दिक, और नहीं स्ट्रिंग ऑब्जेक्ट है। नोट निम्नलिखित प्रकार typeof फ़ंक्शन का उपयोग:

typeof ""    // => "string" 
typeof new String("") // => "object" 
typeof []    // => "object" 
typeof new Array() // => "object" 
+0

'शाब्दिक स्ट्रिंग' और 'स्ट्रिंग' ऑब्जेक्ट के बीच क्या अंतर है और यह (स्पष्ट रूप से) क्यों महत्वपूर्ण है? जहां तक ​​मुझे पता है कि उन्हें एक दूसरे के लिए इस्तेमाल किया जा सकता है लेकिन नतीजा यह है कि आप 'exampleof' का उपयोग नहीं कर सकते हैं यह जांचने के लिए कि क्या कोई' स्ट्रिंग ' – Halcyon

+1

है, लेकिन '[]' एक सरणी अक्षर जैसा नहीं है' '' एक स्ट्रिंग अक्षर है? – FishBasketGordo

+0

@ फिशबास्केट गॉर्डो सरणी में सभी प्रकार के प्राइमेटिव्स और ऑब्जेक्ट्स हो सकते हैं। –

11

क्योंकि '' आदिम, एक वस्तु नहीं है यह।

जावास्क्रिप्ट में कुछ प्राइमेटिव्स में ऑब्जेक्ट रैपर हो सकता है। ये के साथ निर्मित कन्स्ट्रक्टर का उपयोग करके रैपर के इंस्टेंस बनाते समय बनाए जाते हैं।

new आम तौर पर आवश्यक है क्योंकि यदि आप new को बहिष्कृत करते हैं तो अक्सर फ़ंक्शन एक आदिम पर सहभागिता करेगा।

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

पुरातन है कि वस्तु रैपर string, number और boolean हैं।

प्राइमेटिव्स जो null और undefined नहीं हैं।

+0

तो '[]' के आदिम (यानी गैर-रैपर ऑब्जेक्ट) क्या है? – Randomblue

+2

रैंडोम्ब्लू: कोई नहीं है। एक ऐरे हमेशा एक वस्तु है। –

+0

@Randomblue मौजूद नहीं है। एक आदिम क्यों होगा? – Raynos

3

'' कुछ भी नहीं है; यह एक आदिम प्रकार है, और यह 5.5 या true जैसा ही काम करता है। स्ट्रिंग आदिम और स्ट्रिंग ऑब्जेक्ट के बीच एक अंतर है। देखें:

new String('') instanceof String; // true 

कुछ भी new String(), new Number() या new Boolean() के साथ बनाया आदिम प्रकार के चारों ओर एक वस्तु आवरण है, और वे एक ही नहीं कर रहे हैं।

आदि तार के लिए जाँच करने के लिए, के बजाय typeof का उपयोग करें:

typeof '' === 'string'; // true 

दोनों के लिए जाँच करने के लिए, इस का उपयोग करें:

Object.prototype.toString.call('') === '[object String]'; // true 
Object.prototype.toString.call(new String('')) === '[object String]'; // true 

रहे हैं कारणों की एक जोड़ी के लिए Object.prototype.toString.call उपयोग करने के लिए सरणी, स्ट्रिंग्स, संख्या और बूलियन के लिए सामान्य उपयोग कोड। वे हैं:

  1. तारों, संख्याओं और बूलियन के लिए, लोग आदिम प्रकारों के बजाय रैपर ऑब्जेक्ट्स के उदाहरण पास कर सकते हैं। वे आम तौर पर उसी तरह काम करते हैं (एक अंतर्निहित valueOf() के साथ) और इसलिए यदि आपको लाइब्रेरी कोड लिखना है तो आपको उन्हें स्वीकार करना चाहिए।
  2. सरणी के लिए, यदि आपको किसी अन्य विंडो (से कहें) से प्राप्त करें तो instanceof Arrayfalse का उपयोग करेगा। Object.prototype.toString.call विधि सभी उद्देश्यों के लिए काम करता है।

यह jQuery और अन्य बड़े, लोकप्रिय पुस्तकालयों में यही है।

1

मैंने कुछ खुदाई की है और मुझे लगता है कि इसे string interning के साथ करना है जो एक कंपाइलर अनुकूलन है।

ठीक है, कुछ गॉथस के लिए तैयार है? : डी

"abc" == "abc"; // true 
"abc" === "abc"; // true 

मुझे लगता है इस वजह से "स्ट्रिंग होना शामिल" जो संयोग से भी ('तार' सही प्राप्त करने के लिए Yay) भावना का एक बहुत, धारणात्मक बनाता का सच है। अगर आप को लगता है एक String एक वस्तु है और एक वस्तु केवल खुद के बराबर और समान नहीं समान आंतरिक स्थिति के साथ आपत्ति है

new String("abc") == new String("abc"); // false 
new String("abc") === new String("abc"); // false 

यह समझ में आता है। जावा में पसंद है (या यह वैसे भी कैसे किया जाता है)।

और अब किकर के लिए:

(new String("abc")).substr(0,3) === (new String("abc")).substr(0,3); // true! 

तो जाहिरा तौर पर जावास्क्रिप्ट दुभाषिया हमेशा स्ट्रिंग String वस्तु के उपयोग पर होना शामिल करेगी।

तब मुझे पूछना चाहिए कि String ऑब्जेक्ट का उपयोग क्या है? जाहिर है यह अपने दोस्तों के साथ अच्छा नहीं खेलता है।

+0

पहला, 'एबीसी "===" एबीसी "' स्ट्रिंग इंटर्निंग की वजह से नहीं है। सख्त समानता काम करता है जैसा कि आप प्राचीन प्रकार के लिए उम्मीद करेंगे। '===' ऑब्जेक्ट्स के लिए केवल "संदर्भ-बराबर" है। – Ryan

+0

स्ट्रिंग 'टाइप' केवल आपके प्रोटोटाइप को विस्तारित करने और आपको 'ऑब्जेक्ट्स' जैसी स्ट्रिंग बनाने की अनुमति देने के लिए है। वह ऑब्जेक्ट्स (सी में पॉइंटर्स के समान) केवल '===' होगा यदि वे 'वही पॉइंटर' हैं – Adaptabi

संबंधित मुद्दे