2012-01-06 15 views
27

मैं वस्तुओं को संवारता किया गया है और उचित रूप में आप '' एक संपत्ति नाम के रूप में हो सकता है (एक खाली स्ट्रिंग), इसलिए जैसे:क्या मैं एक ऑब्जेक्ट पहचानकर्ता के रूप में खाली स्ट्रिंग का उपयोग कर सकता हूं?

o = { 
    '': 'hello', 
    1:  'world', 
    'abc': ':-)', 
}; 
console.log(o['']); 

ठीक काम करने के लिए लगता है, हालांकि मुझे पता है कि उत्सुक हूँ, क्या यह वास्तव में मान्य है? मैंने ईसीएमए चश्मे पर पोक किया है और हमारे हमेशा के जानकार मित्र से प्रश्न के Google विविधता से पूछा है और मेरा निष्कर्ष यह है कि मुझे पता नहीं है।

मेरे सूत्रों

http://www.jibbering.com/faq/faq_notes/square_brackets.html

+1

मुझे लगता है कि यह मान्य है क्योंकि यह एक स्ट्रिंग भी है, इसलिए इससे कोई फर्क नहीं पड़ता कि स्ट्रिंग में कुछ है या नहीं। लेकिन मुझे लगता है कि यह ऐसी चीज पर निर्भर रहने के लिए नहीं बचा है क्योंकि आखिरकार कुछ दिन यह बदल सकता है ... – evotopid

उत्तर

21

हाँ, तकनीकी रूप से इसकी पूरी तरह से वैध और आप सुरक्षित रूप से उपयोग कर सकते हैं। एक ऑब्जेक्ट कुंजी को "स्ट्रिंग" होना आवश्यक है, जो खाली स्ट्रिंग को बाहर नहीं करता है।

यदि यह अविश्वसनीय और उपयोगी है तो एक और कहानी है।

Should I use an empty property key?


के बाद से 'रिक्त स्ट्रिंग' ECMAScript में falsy values में से एक है देखो, निम्न उदाहरण पर विचार करें:

var foo = { 
    ':-)': 'face', 
    'answer': 42, 
    '': 'empty' 
}; 

Object.keys(foo).forEach(function(key) { 
    if(key) { 
     console.log(key); 
    } 
}); 

स्निपेट है, जो केवल :-) और answer लॉग इन करेगा। तो यह करने के लिए यह एक झगड़ा है।

+0

बहुत सच्चाई, जैसा कि एक संपत्ति संख्यात्मक 0 – oodavid

+1

यह थोड़े कलात्मक है, क्योंकि w/o अगर (कुंजी) लॉग करता है प्रश्न – OnTheFly

+3

@oodavid में सभी गुण: वास्तव में, '0' कोई समस्या नहीं होगी। चूंकि सभी ऑब्जेक्ट कुंजियां ** तार ** हैं, परिणाम "0" 'होगा, जो फिर से एक झूठा मूल्य नहीं है। – jAndy

4

Seems fine ((*) अपने मामले के लिए लागू):

PropertyAssignment : 
    (*) PropertyName : AssignmentExpression 
    get PropertyName () { FunctionBody } 
    set PropertyName (PropertySetParameterList) { FunctionBody } 

PropertyName : 
    IdentifierName 
    (*) StringLiteral 
    NumericLiteral 

StringLiteral :: 
    " DoubleStringCharacters opt " 
    (*) ' SingleStringCharacters opt ' 

के बाद से पात्रों वैकल्पिक हैं, एक खाली स्ट्रिंग मान्य है।

बस ध्यान दें कि IdentifierName (अर्थात ' या " के बिना) एक खाली स्ट्रिंग अनुमति नहीं देता:

IdentifierName :: 
    IdentifierStart 
    IdentifierName IdentifierPart 

IdentifierStart :: 
    UnicodeLetter 
    $ 
    _ 
    \ UnicodeEscapeSequence 

तो, {'': 123} वैध है जबकि {: 123} नहीं है।

0

आज मुझे क्रोम 33.0.1750.146 में परेशानी का सामना करना पड़ा।

obj = { 
    ... 
    "": "some text", 
    ... 
}; 
... 
var a = ""; 
if (typeof obj[a] == 'undefined') { 
    ... 
} 

जब मैं इस स्क्रिप्ट को डिबगिंग या निष्पादित कर रहा हूं तो स्थिति हमेशा "सत्य" होती है। लेकिन अगर मैं कंसोल में (टाइप ओबीजे [ए] == 'अपरिभाषित') के मूल्य की जांच करने की कोशिश कर रहा हूं तो मुझे हमेशा "गलत" मिल रहा है। परेशानी को ढूंढना बहुत मुश्किल था। और मुझे लगता है कि आपको खाली कुंजी (और मुझे भी) का उपयोग नहीं करना है।

+0

कम से कम 36.0.1985.125 में नहीं होता है :) –

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

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