2012-04-27 15 views
5

Estaba buscando a través de un código de una extensión de Firefox (aquí: https://github.com/mozilla/prospector/blob/master/oneLiner/bootstrap.js#L34) y vi algo que nunca había visto en javascript. El programador ha usado una matriz asociativa como el nombre de la variable. ¿Podría alguien explicarme cómo funciona esta referencia variable?¿Utiliza una matriz asociativa como nombre de variable? - javascript

const {classes: Cc, interfaces: Ci, utils: Cu} = Components; 

entiendo la "const" de la lectura de esta página: https://developer.mozilla.org/en/JavaScript/Reference/Statements/const

Pero cómo es capaz de utilizar un objeto array asociativo como nombre de variable?

Además, parece estar utilizando nombres clave en la matriz asociativa como referencias a los métodos de los componentes (enumerados aquí: https://developer.mozilla.org/en/Components_object). Siempre pensé que un nombre de clave tenía que ir primero y luego el valor, pero esto parece poner primero el valor de la referencia al método de clases de Componentes y luego asignarlo a un nombre de Cc aunque Cc está en el lugar donde un valor iría (y Ci para el método de interfaces de componentes & Cu para el método Utils de componentes).

+2

En JavaScript, el término habitual para lo que' ve llamado "matriz asociativa" es solo "objeto" (o a veces "mapa" o "diccionario"). Evitamos decir "conjunto asociativo" porque es confuso para las personas menos informadas que piensan que se relaciona con el tipo 'Array'. –

+2

posible duplicado de [Constante declaración con bloque] (http://stackoverflow.com/questions/10199229/constant-declaration-with-block) –

Respuesta

6

Lo que está viendo es una asignación desestructurada, que está disponible desde el Javascript 1,7 ver esta documentación para obtener más información https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7

asignación desestructurada hace posible extraer datos de las matrices u objetos utilizando una sintaxis que los espejos la construcción de los literales de objeto array y . Las expresiones literales objeto y matriz proporcionan una manera fácil de crear paquetes de datos ad-hoc. Una vez que haya creado estos paquetes de datos , puede usarlos de la forma que desee. Incluso puede devolverlos desde las funciones.

+0

Big +1. Y, aparentemente, ECMAScript6 tendrá * algún tipo de asignación de desestructuración, aunque puede que no sea (o pueda) totalmente compatible con la de Mozilla. –

+0

Gracias por el enlace. Había buscado en google antes de publicar pero no encontré nada. Este ejemplo parece explicarlo bastante bien: https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7#Looping_across_values_in_an_array_of_objects Aún parece extraño intercambiar la clave: el valor en general. – Yansky

0

Sí, mira esto:

var abc = {classes: "ABC", interfaces: "DEF", utils: "XYZ"}; 
const {classes: Cc, interfaces: Ci, utils: Cu} = abc; 
console.debug("test: ", Cc, Ci, Cu); 

Parece que un montón de diversión, especialmente para la persona que está leyendo el código :)

+0

Lo peor es que solo es compatible con Firefox. Entonces, básicamente obligas a tu lector a aprender (y mantenerse separado) un idioma diferente. –

+0

Bueno, he probado este [enlace] (http://therelentlessfrontend.com/2010/10/02/how-to-get-the-javascript-version/) y me dijo que mi Chrome también admite 1.7, y firefox - 1.8, pero esta afirmación no funciona en Chrome ... además, IE9 solo admite 1.3: D – Igor

Cuestiones relacionadas