2011-08-08 16 views
60
var a,b,c; 
var arr = [1,2,3]; 
[a,b,c] = arr; 

Este código funciona perfectamente en Firefox dando como resultado a = 1, b = 2 yc = 3,
pero no funciona en Chrome. ¿Es una falla de Chrome o
no es código JavaScript válido? (No pude encontrarlo en las referencias de javascript)Javascript. Asignar valores de matriz a múltiples variables?

¿Cómo puedo modificar este código para que sea adecuado para Chrome, con un daño mínimo?
(no me gusta mucho escribir = arr [0]; b = arr [1] ... o el mismo con arr.shift() todo el tiempo)

P. S. esto es sólo un código de ejemplo, en el código real
consigo la matriz arr desde algún lugar fuera de mi código

+1

¿Qué sucede en Chrome? ¿Qué mensaje de error recibes? –

+0

me da lo siguiente: ReferenceError argumentos: Array [0] mensaje: "-" pila: "-" tipo: "invalid_lhs_in_assignment" __proto__: Error – tsds

+1

Fwiw, http://www.jslint.com/ dice que está bien (después de arreglar algunos espacios en blanco, aunque no sé qué evaluaría), pero http://jshint.com/ dice que es una mala tarea. – JAAulde

Respuesta

64

Esta es una nueva característica de JavaScript 1.7 llama Destructuring assignment:

Destructuring assignment makes it possible to extract data from arrays or objects using a syntax that mirrors the construction of array and object literals.

The object and array literal expressions provide an easy way to create ad-hoc packages of data. Once you've created these packages of data, you can use them any way you want to. You can even return them from functions.

One particularly useful thing you can do with destructuring assignment is to read an entire structure in a single statement, although there are a number of interesting things you can do with them, as shown in the section full of examples that follows.

You can use destructuring assignment, for example, to swap values:

var a = 1; 
var b = 3; 
[a, b] = [b, a]; 

This capability is similar to features present in languages such as Perl and Python.

Desafortunadamente, según this table of versions, JavaScript 1.7 no se ha implementado en Chrome. Pero debe estar allí en:

  • Firefox 2.0+
  • IE 9
  • Opera 11.50.

intentarlo por sí mismo en este jsFiddle: http://jsfiddle.net/uBReg/

He probado esto en Chrome (fallido), IE 8 (no), y Firefox 5 (que funcionaba, según la tabla wiki).

+0

Destructuring es (probable) [viene como una característica del idioma oficial] (http://wiki.ecmascript.org/doku.php?id=harmony:destructuring) en la próxima versión de ECMAScript, entonces Google Chrome ciertamente llegará allí suponiendo que la propuesta se mantenga. – user113716

+1

Eso sería genial; hay algunas características interesantes en JavaScript 1.7+ ... es lamentable que no se puedan usar para aplicaciones del "mundo real" en este momento debido a estas incompatibilidades del navegador. –

+0

bien. ¿Crees que hay una forma más compacta y clara de hacer lo mismo que a = arr.shift()? – tsds

7

Es posible solo para Javascript 1.7 como ya fue respondido por @Justin. Aquí hay una versión de prueba para simularlo en los navegadores generalizados:

function assign(arr, vars) { 
    var x = {}; 
    var num = Math.min(arr.length, vars.length); 
    for (var i = 0; i < num; ++i) { 
     x[vars[i]] = arr[i]; 
    } 
    return x; 
} 
var arr = [1, 2, 3]; 
var x = assign(arr, ['a', 'b', 'c']); 
var z = x.a + x.b + x.c; // z == 6 

No sé lo útil que es.

Cuestiones relacionadas