objects - javascript destructuring function parameter
¿Puedo declarar previamente las variables para desestructurar la asignación de objetos? (1)
Esta pregunta ya tiene una respuesta aquí:
- Desestructuración de objetos sin var 2 respuestas
Fondo
Cuando intenté desestructurar la asignación con matrices, pude declarar previamente mis variables:
let a, b, c;
let arr = [1, 2, 3, 4, 5];
[a, b, c] = arr;
console.log(a) // logs 1
console.log(b) // logs 2
console.log(c) // logs 3
Esto pasó por el compilador de Babel muy bien.
Sin embargo, cuando intenté hacer lo mismo con los objetos, recibí un error.
let a, b, c
let obj = {cat: ''meow'', dog: ''woof'', mouse: ''squeak''};
{cat: a, dog: b, mouse: c} = obj;
console.log(a) // I want this to log ''meow''
console.log(b) // I want this to log ''woof''
console.log(c) // I want this to log ''squeak''
Pregunta
¿Es este un problema / problema de ES6 o Babel? Si es intencional para ES6, ¿por qué la diferencia con la forma en que se tratan las matrices?
Nota
Entiendo que reemplazar var
con let
significa que no estoy obligado a declarar previamente mis variables y que tener el permiso en línea es válido (y, en mi opinión, generalmente preferido). Me gustaría saber acerca de la diferencia entre implementaciones en lugar de una respuesta de "no hacerlo así".
Cuando estás destruyendo un objeto,
debe utilizar los mismos nombres de variable que las claves en el objeto. Solo así obtendrá una correspondencia uno a uno y los valores se desestructurarán correctamente.
y debe ajustar la asignación completa entre paréntesis si no está utilizando una declaración de declaración, de lo contrario, el literal del objeto en la expresión del lado izquierdo se consideraría un bloque y obtendrá SyntaxError.
Entonces tu código fijo sería así
''use strict'';
let cat, dog, mouse;
let obj = {cat: ''meow'', dog: ''woof'', mouse: ''squeak''};
({cat, dog, mouse} = obj); // Note the `()` around
Realmente puedes escribir lo mismo que
''use strict'';
let obj = {cat: ''meow'', dog: ''woof'', mouse: ''squeak''};
let {cat, dog, mouse} = obj;