क्यों टाइपोफ़ नल "वस्तु" है?


241

मैं 'प्रोफेशनल जावास्क्रिप्ट फॉर वेब डेवेलपर्स चैप्टर 4' पढ़ रहा हूं और यह बताता है कि पाँच प्रकार के प्राइमरी हैं: अपरिभाषित, अशक्त, बूलियन, संख्या और स्ट्रिंग।

यदि nullएक आदिम है, तो क्यों typeof(null)लौटता है "object"?

क्या इसका मतलब यह नहीं है कि nullसंदर्भ द्वारा पारित किया गया है (मैं मान रहा हूँ कि सभी वस्तुओं को संदर्भ द्वारा पारित किया जाता है), इसलिए यह एक आदिम नहीं है?


50
उत्तर: क्योंकि युक्ति ऐसा कहती है। यह आमतौर पर एक गलती के रूप में माना जाता है।
एसएलके

5
ध्यान दें, टाइपोफ़ एक ऑपरेटर है, एक फ़ंक्शन नहीं है (और वास्तव में आप इसके बाद आने वाले चारों ओर कोष्ठकों को छोड़ सकते हैं), इसलिए यहां संदर्भ से गुजरने के बारे में बात करने का कोई मतलब नहीं है। "जावास्क्रिप्ट: द गुड पार्ट्स" पुस्तक में वास्तव में इस तथ्य का उल्लेख है कि परिशिष्ट A के खंड A.6 में टाइपऑफ null === 'ऑब्जेक्ट' है, जिसका शीर्षक 'Awful Parts' है।
जॉन सोंडरसन

5
मुझे लगता है कि मैं '
अवफुल

1
भारी गलती, अथाह! :)
अलेक्जेंडर मिल्स

2
तो चर के प्रकार की जाँच करने के लिए हमें टाइपोफ के बजाय क्या प्रयोग करना चाहिए? मुझे यह जानना अच्छा लगेगा कि यह (बूलियन, स्ट्रिंग, संख्या, सरणी, ऑब्जेक्ट, फंक्शन, सिंबल, नल, अपरिभाषित, NaN) के बीच क्या है
कोस्टा

जवाबों:


219

से के व्यवहार के बारे MDN पेज typeofऑपरेटर :

null

// यह जावास्क्रिप्ट की शुरुआत के बाद से खड़ा है
टाइपोफ़ नल === 'ऑब्जेक्ट';

जावास्क्रिप्ट के पहले कार्यान्वयन में, जावास्क्रिप्ट मूल्यों को एक प्रकार के टैग और एक मूल्य के रूप में दर्शाया गया था। वस्तुओं का प्रकार टैग 0. nullथा जिसे NULL पॉइंटर (अधिकांश प्लेटफार्मों में 0x00) के रूप में दर्शाया गया था। नतीजतन, शून्य में टाइप टैग के रूप में 0 था, इसलिए "ऑब्जेक्ट" typeofरिटर्न वैल्यू है। ( संदर्भ )

ECMAScript (एक ऑप्ट-इन के माध्यम से) के लिए एक फिक्स प्रस्तावित किया गया था , लेकिन अस्वीकार कर दिया गया था । इसका परिणाम होता typeof null === 'null'


137
यह शर्म की बात है कि इस बदलाव ने इसे कम से कम सख्त मोड में नहीं डाला ...
इंगो बुर्क

लोग क्वर्क का फायदा उठा रहे हैं, और अगर बाहर नहीं निकले तो कई कोड बदलने
कोल्ड सेर्बस

यह कुछ जीवित लोगों के लिए अधिक समझ में आता है जो यह चाहते हैं कि उनके कोड को बदलना पड़े, बाकी डेवलपर्स के लिए इसे सीखने के लिए बाकी समय की तुलना में। सिर्फ इसलिए कि कोई व्यक्ति अभी तक अस्तित्व में नहीं है, जरूरी नहीं कि वे मायने नहीं रखते, इसका मतलब यह है कि वे रक्षाहीन हैं।
रीड

इसका कोई मतलब नहीं है कि लोग इसे वैसे भी एक शून्य जांच के रूप में उपयोग करेंगे। यह सहज ज्ञान युक्त नहीं है इसलिए वे इसका उपयोग क्यों करेंगे? अब खराब कोडिंग के कारण परिवर्तन नहीं जोड़ा जा सकता है।
एमोबे

69

यदि nullएक आदिम है, तो क्यों typeof(null)लौटता है "object"?

क्योंकि युक्ति ऐसा कहती है

11.4.3typeof ऑपरेटर

उत्पादन UnaryExpression : typeof UnaryExpression का मूल्यांकन निम्नानुसार किया जाता है:

  1. चलो वैल के मूल्यांकन का परिणाम हो UnaryExpression
  2. यदि प्रकार ( वैल ) संदर्भ है , तो
       ए। यदि IsUnresolvableReference ( वैल ) सही है , " undefined" लौटें ।
       ख। चलो वैल हो getValue ( वैल )।
  3. प्रकार द्वारा निर्धारित स्ट्रिंग लौटाएँ (तालिका 20 के अनुसार वैल ) ।

यहां छवि विवरण दर्ज करें


@peter typeofआपको इस बारे में कुछ नहीं बताता है कि आप किसी चीज़ पर तरीके कॉल कर सकते हैं या नहीं।
मैट बॉल

2
मेरी जानकारी के लिए, आप इसके अलावा nullऔर किसी भी तरीके पर कॉल कर सकते हैं undefined
मैट बॉल

4
@peter आप एक स्ट्रिंग आदिम पर तरीकों को नहीं कह सकते हैं, लेकिन शुक्र है कि स्ट्रिंग प्राइमिटिव्स (और नंबर प्राइमिटिव्स और बूलियन प्राइमेटिव्स) स्पष्ट रूप से और स्वचालित रूप से "ऑटो-बॉक्सिंग" स्ट्रिंग, नंबर और बुलियन रैपर में हैं, जब किसी प्रॉपर्टी के साथ एक प्राइमेटिव का उपयोग करते हैं संदर्भ ऑपरेटर ( .या [ ])।
नुकीले

28

जैसा कि बताया गया है, युक्ति ऐसा कहती है। लेकिन जब से जावास्क्रिप्ट के कार्यान्वयन ECMAScript युक्ति के लेखन की भविष्यवाणी की है, और विनिर्देश प्रारंभिक कार्यान्वयन के foibles को सही नहीं करने के लिए सावधान था, वहाँ अभी भी एक वैध सवाल है कि यह पहली जगह में इस तरह क्यों किया गया था। डगलस क्रॉकफोर्ड इसे गलती कहते हैं । किरो रिस्क सोचता है कि यह थोड़े मायने रखता है :

इसके पीछे तर्क यह है कि nullइसके विपरीत undefined, (और अभी भी है) अक्सर उपयोग किया जाता है जहां ऑब्जेक्ट दिखाई देते हैं। दूसरे शब्दों में, nullअक्सर किसी वस्तु के खाली संदर्भ को दर्शाने के लिए उपयोग किया जाता है। जब ब्रेंडन ईच ने जावास्क्रिप्ट बनाया, तो उन्होंने उसी प्रतिमान का पालन किया, और "वस्तु" को वापस करने के लिए समझदारी (यकीनन) बनाई। वास्तव में, ECMAScript विनिर्देश आदिम मूल्य केnull रूप में परिभाषित करता है जो किसी भी वस्तु मूल्य (ECMA-262, 11.4.11) की जानबूझकर अनुपस्थिति का प्रतिनिधित्व करता है


3
चूँकि मैं अब उस वीडियो को नहीं खोज पाऊँगा, जिसे मैं सिर्फ जिज्ञासु लोगों के लिए और किसी भी संदर्भ के बिना पोस्ट करूँगा: क्रॉकफोर्ड ने बताया कि शून्य प्रकार के निराकरण पर एक शून्य मान कैसे प्रकार सरणी पर शून्य अनुक्रमित तत्व को इंगित करता है, इसलिए यह एक स्पष्ट था बग को विकसित करना, जिसे माइक्रोसॉफ्ट के लोगों ने गलती से प्रचारित किया, जब जेएस ने अपने ब्राउज़र के लिए विघटित और पुन
स्थापित किया

6

YDKJS पुस्तक से

यह जेएस में एक लंबे समय तक चलने वाला बग है, लेकिन एक जो कभी भी तय नहीं होने वाला है। वेब पर बहुत अधिक कोड बग पर निर्भर करता है और इस प्रकार इसे ठीक करने से बहुत अधिक कीड़े पैदा होंगे!


1
भरोसा मत करो सब कुछ एक किताब में लिखा है। मैं वास्तव में उस पुस्तक से प्यार करता हूं, हालांकि, मैं उस बग पर विचार नहीं कर सकता, क्योंकि जावास्क्रिप्ट राज्य के लिए ECMA विनिर्देश है कि नल का प्रकार एक वस्तु होना चाहिए।
andreasonny83

4

यदि nullएक आदिम है, तो typeof(null)" object" क्यों लौटाता है ?

संक्षेप में: यह ECMAScript में बग है, और प्रकार होना चाहिए null

संदर्भ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null


1
आपके संदर्भ में यह कहीं नहीं बताता है कि यह एक बग है।
user2867288

1
और कहीं भी युक्ति में यह नहीं लिखा है कि टाइपोफ को कुछ भी "लेकिन अपरिभाषित", "वस्तु", "बूलियन", "संख्या", "स्ट्रिंग", "फ़ंक्शन" और "प्रतीक" (ECMAScript 2015)
ब्रैड केंट

1

जावास्क्रिप्ट में अशक्त "कुछ नहीं" है। यह ऐसा कुछ माना जाता है जो अस्तित्व में नहीं है। दुर्भाग्य से, जावास्क्रिप्ट में, डेटा प्रकार का नल एक वस्तु है। आप इसे जावास्क्रिप्ट में एक बग मान सकते हैं कि टाइपऑफ नल एक वस्तु है। यह अशक्त होना चाहिए।


0

जावास्क्रिप्ट में, टाइपोफ़ नल 'ऑब्जेक्ट' है, जो गलत तरीके से सुझाव देता है कि नल एक ऑब्जेक्ट है। यह एक बग है और एक कि दुर्भाग्य से तय नहीं किया जा सकता है, क्योंकि यह मौजूदा कोड को तोड़ देगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.