2012-01-06 14 views
27

Ho armeggiare con gli oggetti e apparentemente si può avere '' (una stringa vuota) come un nome di proprietà, in questo modo:Posso usare una stringa vuota come identificatore di oggetto?

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

sembra funzionare bene, però io sono curioso di sapere, è veramente valido? Ho esaminato le specifiche ECMA e ho chiesto al nostro amico sempre informato variazioni su Google della domanda e la mia conclusione è che non so.

Le mie fonti

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

+1

Penso che sia valido perché è anche una stringa, quindi non importa se la stringa contiene qualcosa o meno. Ma penso che non si possa fare affidamento su una cosa del genere perché alla fine un giorno questo potrebbe cambiare ... – evotopid

risposta

21

Sì, tecnicamente la sua totalmente valida e si può utilizzare in sicurezza. Una chiave oggetto deve essere una "stringa", che non esclude una stringa vuota.

Se questo è conveniente e utile è un'altra storia.

Vedi Should I use an empty property key?


Dal momento che la 'stringa vuota' è uno dei falsy values in ECMAScript, si consideri il seguente esempio:

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

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

Questo frammento sarebbe accedere solo :-) e answer. Quindi questa è una trappola per farlo.

+0

Molto vero, come lo sarebbe una proprietà numerica 0 – oodavid

+1

Questo è un po 'artificiale, perché w/o se (chiave) registra tutte le proprietà in questione – OnTheFly

+3

@oodavid: infatti, '0' non sarebbe un problema. Poiché tutte le chiavi oggetto sono ** stringhe ** il risultato sarebbe '" 0 "', che di nuovo non è un valore falsato. – jAndy

4

Seems fine (il (*) applicano al tuo caso):

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

PropertyName : 
    IdentifierName 
    (*) StringLiteral 
    NumericLiteral 

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

Dal momento che i personaggi sono opzionali, una stringa vuota è valida.

Basta notare che IdentifierName (vale a dire senza ' o ") non consente una stringa vuota:

IdentifierName :: 
    IdentifierStart 
    IdentifierName IdentifierPart 

IdentifierStart :: 
    UnicodeLetter 
    $ 
    _ 
    \ UnicodeEscapeSequence 

Quindi, {'': 123} è valido, mentre {: 123} non lo è.

0

Oggi ho avuto problemi con Chrome 33.0.1750.146.

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

Quando eseguo il debug o eseguo questo script, la condizione è sempre "True" Ma se sto cercando di verificare il valore di (typeof obj [a] == 'undefined') in console, sto ricevendo sempre "False". È stato molto difficile trovare il problema. E penso che tu non debba usare le chiavi vuote (e anche me).

+0

Non succede in 36.0.1985.125 almeno :) –

Problemi correlati