2012-01-06 19 views
27

He estado jugando con los objetos y aparentemente puedo tener '' (una cadena vacía) como un nombre de propiedad, así:¿Puedo usar una cadena vacía como identificador de objeto?

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

parece funcionar muy bien, sin embargo, tengo curiosidad de saber, ¿es esto realmente válido? He hurgado en las especificaciones de ECMA y le hemos preguntado a nuestro amigo conocedor Google variaciones de la pregunta y mi conclusión es que No sé.

Mis fuentes

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

+1

Creo que es válido porque también es una cadena, por lo que no importa si la cadena contiene algo o no. Pero creo que no es seguro confiar en tal cosa porque eventualmente algún día esto podría cambiar ... – evotopid

Respuesta

21

Sí, técnicamente es totalmente válida y se puede utilizar con seguridad. Una clave de objeto debe ser una "cadena", que no excluye una cadena vacía.

Si eso es conveniente y útil es otra historia.

Ver Should I use an empty property key?


Desde la 'cadena vacía' es uno de los falsy values en ECMAScript, considere el siguiente ejemplo:

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

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

Este recorte podría registrar sólo :-) y answer. Entonces esa es una trampa para hacer esto.

+0

Muy cierto, como lo sería una propiedad numérica 0 – oodavid

+1

Esto es un poco artificial, porque sin/si (clave) registra todas las propiedades en cuestión – OnTheFly

+3

@oodavid: de hecho, '0' no sería un problema. Como todas las teclas de objeto son ** cadenas **, el resultado sería '" 0 "', que de nuevo no es un valor falso. – jAndy

4

Seems fine (el (*) se aplican a su caso):

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

PropertyName : 
    IdentifierName 
    (*) StringLiteral 
    NumericLiteral 

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

Dado que los caracteres son opcionales, una cadena vacía es válido.

Ten en cuenta que IdentifierName (es decir, sin ' o ") no permite una cadena vacía:

IdentifierName :: 
    IdentifierStart 
    IdentifierName IdentifierPart 

IdentifierStart :: 
    UnicodeLetter 
    $ 
    _ 
    \ UnicodeEscapeSequence 

Así, {'': 123} es válida mientras que {: 123} no lo es.

0

Hoy tuve problemas en Chrome 33.0.1750.146.

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

Cuando estoy depurando o ejecutando este script, la condición es siempre "Verdadero". Pero si estoy tratando de verificar el valor de (typeof obj [a] == 'undefined') en la consola siempre me aparece "False". Fue muy difícil encontrar el problema. Y creo que no debes usar llaves vacías (y yo también).

+0

No ocurre en 36.0.1985.125 al menos :) –

Cuestiones relacionadas