parameter objects inside es6 advanced javascript ecmascript-6 babeljs destructuring

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í:

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,

  1. 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.

  2. 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;