2010-11-15 4 views
12

पुस्तक जावास्क्रिप्ट में अच्छा भागों, वस्तुओं पर CH3 के उद्घाटन के पृष्ठ पर, यह कहा गया है:क्रॉकफ़ोर्ड का क्या अर्थ है जब वह कहता है कि अपरिभाषित संपत्ति मूल्य नहीं हो सकता है?

एक वस्तु गुण है, जहां एक संपत्ति एक नाम और एक मूल्य है की एक कंटेनर है। खाली स्ट्रिंग समेत एक संपत्ति का नाम कोई स्ट्रिंग हो सकता है। अपरिभाषित को छोड़कर एक संपत्ति मूल्य कोई जावास्क्रिप्ट मान हो सकता है।

नोट: अपरिभाषित निरूपित करने के लिए वह यह है कि एक शाब्दिक है पुस्तक में प्रकाश डाला गया है।

प्रैक्टिस में, हालांकि, मैं इसे करने में सक्षम हूं।

var a = { "name": undefined }; 

मेरी समझ में क्या गलत है?

उत्तर

8

मेरा मानना ​​है कि इस सवाल का जवाब है कि वह गलत है है।

जैसा कि आप देखते हैं, आप var a = { "name": undefined }; सेट कर सकते हैं।

  • a.name === undefined
  • a.name === a.someFakeProperty

यहाँ, है, जहां वे अलग हैं, हालांकि:

  • 'someFakeProperty' in a === false
  • 'name' in a === true

या, यह एक अलग तरीके से करते हैं,

  • a.hasOwnProperty('someFakeProperty') === false
  • a.hasOwnProperty('name') === true

कुछ हद तक कुख्यात for..in पाश का उपयोग करना,

for (var i in a) { 
    alert(i); 
} 

... आप name दे देंगे।

तो, मूल्य के अनुसार आप अपरिभाषित और undefined को अलग करने में सक्षम नहीं हो सकते हैं, लेकिन वे आंतरिक रूप से काफी अलग हैं।

अलावा: वह संपत्ति के नाम के बारे में गलत भी है - a[window] = 43; a[window] == 43; बस ठीक है। निश्चित रूप से, आप a.window नहीं कर सकते हैं, लेकिन a.___a['___'] के लिए सिंटैक्टिक चीनी है। टिप्पणियों में उल्लेख के अनुसार, संपत्ति के नाम स्ट्रिंग करने के लिए डाले गए हैं इसलिए मैं इस बिट के बारे में गलत था।

+3

ब्रैकेट नोटेशन का उपयोग करते समय वह संपत्ति के नामों के बारे में गलत नहीं है, अभिव्यक्ति ToString को परिवर्तित कर दी जाएगी, संपत्ति के नाम * केवल स्ट्रिंग * हो सकते हैं, उदाहरण के लिए: var ओ = {toString: फ़ंक्शन() {वापसी 'foo'; }}, ए = {}; एक [ओ] = 'परीक्षण'; चेतावनी (एक ['foo']); 'इस उदाहरण में,' a [o] 'तक पहुंचने से 'o'' स्ट्रिंग में परिवर्तित हो जाएगा, '' foo' 'को संपत्ति के नाम के रूप में उत्पादित किया जाएगा ... – CMS

+0

हाँ। 'ए [' [ऑब्जेक्ट डोमविंडो] '] == 43' आज़माएं। –

+0

आह, मैं देखता हूं ... स्ट्रिंग कास्ट मेरे साथ नहीं हुआ था। उत्तर सही किया गया। –

0

शायद यह:

var a = {"name": x}; //x is undefined, so it will cause an error. 

बस मेरी समझ।

2

मुझे लगता है कि वह क्या कहने की कोशिश कर रहा है यह है कि एक संपत्ति का मूल्य undefined नहीं हो सकता है क्योंकि undefined बिल्कुल जावास्क्रिप्ट मौजूद गुणों को इंगित करता है जो मौजूद नहीं हैं। दूसरे शब्दों में, यदि आप निम्न वस्तु

var a = { "name": undefined }; 

फिर a.nameundefined है, लेकिन इतना a.someFakeProperty है। हालांकि, जैसा कि बेन ली ने अपनी टिप्पणी में बताया, name तब भी दिखाई देगा जब आप a के गुणों को for लूप का उपयोग करते हुए दिखाएंगे, जबकि someFakeProperty नहीं होगा। इसलिए, ऐसा लगता है कि यहां प्रश्न में विचार व्यक्त करने में क्रॉकफोर्ड थोड़ा अपरिहार्य था।

+3

लेकिन अंतर करने का एक तरीका है। यदि आप 'a = {" name ": अपरिभाषित} करते हैं; 'और उसके बाद तत्काल {ए में संलग्न करें) {चेतावनी (एट); } ', आप' नाम 'देखेंगे। इसलिए आंतरिक रूप से इसे 'अपरिभाषित' के मान के साथ ऑब्जेक्ट की संपत्ति के रूप में संग्रहीत किया जाता है। –

+0

@ बेन: बहुत रोचक! मैंने अभी परीक्षण किया है कि फ़ायरफ़ॉक्स में, और ऐसा लगता है कि आप सही हैं। हम्म, मुझे आश्चर्य है कि क्रॉकफोर्ड क्या कहने की कोशिश कर रहा था, फिर ... – bcat

3

मैं शब्दावली कि Crockford का उपयोग करता है पसंद नहीं है, वह undefined और अघोषित की अवधारणा मिश्रण करने लगते हैं।

बयान:

एक संपत्ति के मूल्य अपरिभाषित के अलावा कोई भी जावास्क्रिप्ट मूल्य हो सकता है।

IMO पूरी तरह से गलत है, क्योंकि undefinedभाषा का एकprimitive value है।

यह भी देखें:

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