value instanceof Constructor
Constructor.prototype.isPrototypeOf(value)
रूप में ही है और दोनों की जाँच [[प्रोटोटाइप]] - एक विशिष्ट वस्तु की आवृत्तियां के लिए value
की श्रृंखला।
स्ट्रिंग्स और संख्या आदिम मूल्य, वस्तुओं नहीं हैं और इसलिए [[प्रोटोटाइप]] नहीं है, इसलिए यह केवल तभी काम करेगा जब आप नियमित वस्तुओं (जिसे जावा में 'मुक्केबाजी' कहा जाता है) में लपेटें।
इसके अलावा, जैसा आपने देखा, String(value)
और new String(value)
अलग बातें करते हैं: क्या आप में निर्मित प्रकार new
ऑपरेटर का उपयोग किए बिना, वे विशिष्ट प्रकार के तर्क परिवर्तित करने के लिए ('डाली') की कोशिश की निर्माता कार्यों को कॉल करते हैं । यदि आप new
ऑपरेटर का उपयोग करते हैं, तो वे एक रैपर ऑब्जेक्ट बनाते हैं।
new String(value)
लगभग Object(String(value))
के बराबर है, जो new Object(String(value))
जैसा व्यवहार करता है।
जावास्क्रिप्ट में प्रकार पर कुछ और: ECMA-262 को परिभाषित करता है निम्नलिखित आदिम प्रकार: अपरिभाषित, अशक्त, बूलियन, संख्या, और स्ट्रिंग। इसके अतिरिक्त, गुणों के लिए ऑब्जेक्ट प्रकार है।
उदाहरण के लिए, कार्यों प्रकार वस्तु के हैं (वे सिर्फ एक विशेष संपत्ति कहा जाता है [[कॉल]] है), और null
प्रकार अशक्त की एक आदिम मूल्य है। इसका मतलब है कि typeof
ऑपरेटर का परिणाम वास्तव में एक मान के प्रकार को वापस नहीं करता है ...
आमतौर पर, जावास्क्रिप्ट ऑब्जेक्ट्स में [[वर्ग]] नामक एक और संपत्ति होती है। आप इसे Object.prototype.toString.call(value)
के माध्यम से प्राप्त कर सकते हैं (यह '[object
Classname
]'
) लौटाएगा।Arrays और function ऑब्जेक्ट प्रकार हैं, लेकिन उनकी कक्षाएं ऐरे और फ़ंक्शन हैं।
instanceof
विफल होने पर किसी ऑब्जेक्ट की कक्षा के लिए परीक्षण विफल रहता है (उदाहरण के लिए जब ऑब्जेक्ट विंडो/फ्रेम सीमाओं के बीच पारित होते हैं और समान प्रोटोटाइप साझा नहीं करते हैं)।
इसके अलावा, आप typeof
के इस उन्नत संस्करण की जाँच करने के लिए चाहते हो सकता है: यह लोअर केस में अपने प्रकार वापस आ जाएगी
function typeOf(value) {
var type = typeof value;
switch(type) {
case 'object':
return value === null ? 'null' : Object.prototype.toString.call(value).
match(/^\[object (.*)\]$/)[1]
case 'function':
return 'Function';
default:
return type;
}
}
पुरातन के लिए, वस्तुओं के लिए, यह वापस आ जाएगी उनके वर्गशीर्षक मामले में।
उदाहरण:
प्रकार के पुरातन लिएसंख्या (जैसे 5
), यह 'number'
वापस आ जाएगी, वर्गसंख्या (new Number(5)
जैसे) के आवरण वस्तुओं के लिए, यह 'Number'
वापस आ जाएगा;
कार्यों के लिए, यह 'Function'
वापस करेगा।
आप आदिम मूल्यों और आवरण वस्तुओं के बीच विचार करने के लिए नहीं करना चाहते हैं (जो, शायद बुरा कारण के लिए), typeOf(...).toLowerCase()
का उपयोग करें।
ज्ञात बग आईई में कुछ अंतर्निहित फ़ंक्शंस हैं, जिन्हें 'Object'
माना जाता है और कुछ COM + ऑब्जेक्ट्स के साथ उपयोग किए जाने पर 'unknown'
का वापसी मान माना जाता है।
आपको 'Number.prototype.isPrototypeOf (inp) 'का उपयोग करना होगा - यदि आपका तरीका सही तरीके से किया जाता है तो आपका तरीका भी काम करेगा:' inp.constructor === संख्या'; यह असफल हो सकता है, क्योंकि 'कन्स्ट्रक्टर' प्रोटोटाइप की एक संपत्ति है और इसे ओवरराइट किया जा सकता है! – Christoph
मुझे यकीन नहीं है कि मैं समझता हूं कि 'ओवरराइट किया जा सकता है' के साथ आपका क्या मतलब है। इसका मतलब यह नहीं है कि मैं कुछ अन्य कन्स्ट्रक्टर के साथ कन्स्ट्रक्टर को ओवरराइट कर सकता हूं (इसे आजमाया)। Number.prototype.isPrototypeOf (4) रास्ते से झूठी रिटर्न देता है, इसलिए मैं इसका उपयोग आदिम मूल्यों के प्रकार की जांच के लिए नहीं कर सकता, क्या मैं सही हूँ? – KooiInc
वह पूरा बिंदु था (आदिम! == लपेटा आदिम)! 'Obj [' constructor '] = ??? 'काम करता है क्योंकि कन्स्ट्रक्टर की जांच खतरनाक है! मैं अपने 'टाइपऑफ()' फ़ंक्शन का उपयोग करने का सुझाव दूंगा; प्राइमेटिव्स और लिपटे प्राइमेटिव्स का इलाज करने के लिए, 'if (typeOf (x) .toLowerCase() ===' string ')' – Christoph