2010-08-31 9 views
15

I bumbed en uno de esos momentos en los que acaba de perder el enfoque y empezar a preguntarse sobre una pregunta tonta:¿Cuál es el tipo de "claves" en JavaScript?

var a = { 
    b: "value" 
} 

¿Cuál es el typeof 'b' y no significa que el "valor" typeof, pero la clave real etiquetada como b?

fondo: Me empecé a preguntar sobre esto cuando tuve que crear una clave que es una cadena:

var a = { 
    "b": "value" 
} 

porque en un momento posterior que se hace referencia como:

a["b"] 

Y luego Enviado preguntando la pregunta original.

Respuesta

18

En términos literales de objetos, b es una propiedad. Las propiedades son cadenas en JavaScript, aunque al definir el nombre de la propiedad dentro de un literal de objeto, puede omitir los delimitadores de cadena.

Cuando bucle a través de los nombres de propiedades utilizando un for...in, el nombre de la propiedad es una cadena:

for (key in a) { 
    alert(typeof key); 
    //-> "string" 
} 
+0

Bueno, ahora he empezado a preguntarme si 'clave' es una cadena solo cuando bucleas las teclas en a? - pero supongo que eso depende de la implementación del motor de JavaScript. – tunylund

+0

@tunylund: ninguna clave es una cadena siempre. Di algunos ejemplos en mi respuesta a continuación :) –

+1

@tunylund: Como dijo @ Daniel, la clave siempre es una cadena. Como no hay un caso de uso real para probar el tipo de la clave de un objeto (no el valor de la clave), y no hay forma de hacerlo fuera de enumerar las teclas con un bucle como este, no es algo que deba preocuparse :) –

2

B es una cadena, que es sólo una sintaxis abreviada, por lo que escribir

var a = { 
    b: "value" 
} 

en lugar de

var a = { 
    "b": "value" 
} 
2

Tenga en cuenta que los objetos JavaScript son tablas hash y las teclas son sólo cadenas. Puede omitir las comillas de los nombres de propiedad durante la declaración, pero si utiliza palabras reservadas para nombres de propiedad o cualquier otro nombre que resulte ser un identificador no válido, como comenzar con un dígito o contener espacios, deberá envolver la propiedad nombres entre comillas:

var a = { 
    "1b":  "value", 
    "b and c": "value", 
    "+12345": "value" 
}; 

también tenga en cuenta que puede hacer referencia a las propiedades de los objetos utilizando la notación de puntos o la notación de subíndice, independientemente de si las comillas, donde utilizan cuando se declaran. Sin embargo, si utiliza nombres de propiedades que serían identificadores válidos, tales como los que hay en el ejemplo anterior, se ven obligados a utilizar la notación de subíndice:

a.1b    // invalid (dot notation) 
a["b and c"]; // valid (subscript notation) 
+0

¿Funcionan esos identificadores inválidos en todos los navegadores (principales)? ¿No te arriesgas a lanzar una excepción en algunos motores de JavaScript? –

+1

@Marcel: la notación de subíndice se define mediante la especificación ECMA-262 y cualquier cadena es válida. –

+0

@Marcel: Sí, deberían funcionar en todos los navegadores. Los objetos son tablas hash y aceptan cualquier cadena como clave (nombre de propiedad). Douglas Crockford describe el tema aquí (sección Objetos): http://www.crockford.com/javascript/survey.html –

8

Los nombres de propiedades son obligados de forma automática en una cadena. Puede intentarlo usted mismo utilizando un literal numérico como nombre de propiedad.

var object = { 
    .12e3: 'wut' 
}; 
object[.12e3]; // 'wut' 
object['.12e3']; // undefined 
object['120']; // 'wut' 

// Let’s try another numeric literal: 
object = { 
    12e34: 'heh' 
}; 
object[12e34]; // 'heh' 
object['12e34']; // undefined 
object[1.2e35]; // 'heh' 
object['1.2e35']; // undefined 
object[1.2e+35]; // 'heh' 
object['1.2e+35']; // 'heh' 

Por esta razón, recomendaría utilizar solo literales de cadena para los nombres de las propiedades.

De Unquoted property names/object keys in JavaScript, mi reportaje sobre el tema:

comillas sólo puede omitirse si el nombre de la propiedad es un literal numérico o a valid identifier name.

[...]

notación de soporte puede ser utilizados sin problemas para todos los nombres de las propiedades.

[...]

notación de puntos puede solamente se utiliza cuando el nombre de la propiedad es un nombre identificador válido.

También hice una herramienta que le dirá si un nombre de propiedad determinado puede usarse sin comillas y/o con notación de puntos. Pruébelo en mothereff.in/js-properties.

Screenshot

0

var a = {$ : 'hello', 2123 : 'number'}; 
 
for(var key in a) { 
 
    console.log(typeof key) 
 
}

Keys en javascript objetos pueden ser cadenas y símbolos. símbolo es un tipo de datos primitivo en javascript.

Cuestiones relacionadas