2010-03-25 3 views
24

प्रति http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf के रूप में, जावास्क्रिप्ट 6 प्रकार के होते हैं: undefined, null, boolean, string, number और objectजावास्क्रिप्ट प्रकार

var und; 
console.log(typeof und); // <-- undefined 

var n = null; 
console.log(typeof n); // <--- **object**! 

var b = true; 
console.log(typeof b); // <-- boolean 

var str = "myString" 
console.log(typeof str); // <-- string 

var int = 10; 
console.log(typeof int); // <-- number 

var obj = {} 
console.log(typeof obj); // <-- object 

प्रश्न 1:

क्यों बजाय प्रकार objectnull के रिक्त है?

प्रश्न 2:

क्या कार्यों के बारे में?

var f = function() {}; 
console.log(typeof f); // <-- function 

चर ffunction के प्रकार है। यह एक अलग प्रकार के रूप में विनिर्देश में निर्दिष्ट क्यों नहीं है?

धन्यवाद,

+3

कल्पना में खुदाई, समग्र ज्ञान की तलाश में के लिए +1। –

उत्तर

13

बारे typeof null == 'object', यह एक गलती है कि शुरुआती दिनों से आता है, और दुर्भाग्य से इस गलती को एक लंबे समय के लिए हमारे साथ रहने, यह too lateECMAScript 5 वीं संस्करण विशिष्टता में तय किया जाना था।

बारे कार्यों, वे सिर्फ वस्तुओं हैं, लेकिन वे [[Call]] नामक एक विशेष आंतरिक संपत्ति जो आंतरिक रूप से प्रयोग किया जाता है जब एक समारोह शुरू हो जाती है है।

typeof ऑपरेटर केवल सादे ऑब्जेक्ट्स और फ़ंक्शंस के बीच अंतर करता है यह जांचकर कि ऑब्जेक्ट में यह आंतरिक संपत्ति है या नहीं।

5

क्योंकि typeof "वस्तु" लौटने के लिए करता है, तो इनपुट null है, और वापसी "समारोह" यदि इनपुट प्रतिदेय है परिभाषित किया गया है यह। (देखें 11.4.3 typeof ऑपरेटर।)

मुझे नहीं पता कि मानक इस तरह परिभाषित क्यों किया गया है (and Crockford said it's wrong)। शायद पिछड़ा संगतता।

0

उत्तर 1 प्रश्न:

एक संपत्ति, जब यह कोई परिभाषा है, अनिर्धारित रहता है। नल कारण एक ऑब्जेक्ट है ताकि कोई संपत्ति किसी मूल्य के साथ मौजूद न हो, फिर भी एक परिभाषा है।

+1

असल में मुझे लगता है कि यह भ्रामक है। अपरिभाषित और अविकसित के बीच एक अंतर है। उदाहरण के लिए, 'var x' मौजूदा दायरे में 'x' नाम की एक संपत्ति रखेगा, लेकिन इसका मान' अपरिभाषित' होगा। ऐसा होने से पहले, 'x' स्वयं अनिर्धारित है, और इसका उपयोग करने का प्रयास करने के परिणामस्वरूप' ReferenceError' होगा। – bcherry

+1

इसके अलावा, 'शून्य' * ऑब्जेक्ट नहीं है, यह एक * आदिम मूल्य * है, दुख की बात है कि 'टाइपोफ़' ऑपरेटर गलत है ... – CMS

0

typeof null === "object" क्योंकि spec ऐसा कहता है, लेकिन यह जावास्क्रिप्ट के पहले संस्करण से एक गलती है। (जैसा कि केनीटीएम ऊपर बताता है)।

typeof f === "function" क्योंकि try/catch के बिना, यह निर्धारित करने के लिए कोई अन्य विश्वसनीय, मूर्ख तरीका नहीं है कि कुछ कॉल करने योग्य है या नहीं। f.constructor === Functionका उपयोग काम कर सकता है, लेकिन मुझे लगता है कि ऐसा होने की गारंटी नहीं है।

0

पूर्णता के लिए, ध्यान दें कि प्रकार की जानकारी की जाँच करने के मौजूदा सबसे अच्छा अभ्यास तरीका कुछ इस तरह है:

var typeInfo = Object.prototype.toString.call(yourObject); 

है कि आप एक स्ट्रिंग है की तरह लग रहा देता है "[वस्तु कुछ]" है, जहां "समथिंग" एक प्रकार का नाम है।

+0

'Object.prototype.toString.call (अपरिभाषित) 'मुझे देता है' [ ऑब्जेक्ट विंडो] 'फ़ायरफ़ॉक्स में ओ_ओ। – kennytm

+0

केनीटीएम: ऐसा इसलिए है क्योंकि 'कॉल' या 'लागू' के पहले तर्क के रूप में 'शून्य' या 'अपरिभाषित' का उपयोग किया जाता है, इसलिए लागू किए गए फ़ंक्शन के अंदर संदर्भ ('यह' कीवर्ड) वैश्विक ऑब्जेक्ट पर सेट किया जाएगा। – CMS

+0

दाएं - यदि उस तकनीक का उपयोग करते हैं तो आप शायद पहले स्पष्ट रूप से एक स्पष्ट === परीक्षण करेंगे – Pointy

0

शून्य एक विशेष मूल्य है- यह गलत नहीं है, यह 0 नहीं है, या खाली स्ट्रिंग या NaN या अपरिभाषित है।

शून्य आप जो ऑब्जेक्ट देखते हैं, वह उस वस्तु की तलाश में होती है जो वहां नहीं है- किसी ऑब्जेक्ट की एक अनिर्धारित संपत्ति नहीं है, लेकिन यह बात स्वयं ही है।

एक पाठ के साथ एक पैराग्राफ अगले नोड्स के लिए शून्य वापस लौटाएगा, एक regexp जो सरणी और इसके बजाय रिटर्न नल से मेल नहीं खाता है।

शायद इसका अपना प्रकार, होना चाहिए, लेकिन फिर यह किसी ऑब्जेक्ट की अनुपस्थिति के बजाय किसी प्रकार के साथ कुछ होना शुरू होता है।

0

भी Array.prototype भी है।

  • Object.prototype
  • Array.prototype
  • Function.prototype
  • Number.prototype
  • String.prototype
  • Boolean.prototype

Crockford उपयोग करने के लिए नहीं कहते हैं :

  • नया नंबर()
  • नया स्ट्रिंग()
  • नई बूलियन()