• Saltar al contenido principal

Aprendiendo lenguajes por código

Blog para geek y otras hierbas.

Inicio / Programacion / JavaScript / Todo sobre Destructuring Assignment en JavaScript ES6

Todo sobre Destructuring Assignment en JavaScript ES6

By Francisco Payán on marzo 29, 2019 0

Todo sobre Destructuring Assignment en JavaScript ES6

¿Qué es Destructuring assignment en JavaScript?

Esta nueva funcionalidad de ES6 llamada destructuring assignment es una expresión JavaScript que posibilita la extracción de datos tanto de Arrays  como de Object . Para ello usamos la misma sintaxis que para la creación de Arrays y de Object, es decir, para los Arrays usamos los corchetes [] como constructor y para los Object usamos las llaves {}

Comentar que en otros lenguajes de programación también se usa esta funcionalidad ya que esto no es nada nuevo en lenguajes como Perl, Python, etc.

¿Cómo se usa la expresión Destructuring assignment en JavaScript?

Bien, vamos a poner algunos ejemplos para poder comparar y ver la gran versatilidad y potencia que le podemos sacar a esta funcionalidad nueva de ES6. Tal como comenté podemos usar esta funcionalidad con Arrays y Object de JavaScript.
Bien, pues como diría Jack el destripador vamos por partes.

Imaginemos que tenemos el siguiente código o situación en nuestro fichero JavaScript

  const developer = {
  name: "María",
  age: 26,
  country: "España",
  languages: {
    python: "yes",
    java: "yes",
    php: "yes",
    perl: "not",
    javascript: "yes"
  }
}
function getDeveloperData(dev){
  console.log('Hola, ' + dev.name);
  console.log('Usted sabe python ? ' + (dev.languages.python || ";-)"));
  console.log('Usted sabe java ? ' + (dev.languages.java || ";-)"));
  console.log('Usted sabe php ? ' + (dev.languages.php || ";-)"));
  console.log('Usted sabe perl ? ' + (dev.languages.perl || ";-)"));
  console.log('Usted sabe javascript ? ' + (dev.languages.javascript || ";-)"));
}
getDeveloperData(developer);
//Hola, María
//Usted sabe python ? yes
//Usted sabe java ? yes
//Usted sabe php ? yes
//Usted sabe perl ? not
//Usted sabe javascript ? yes

Es hora de poner en marcha nuestro código y cómo lo qué queremos es obtener los datos de un objeto JavaScript pues empezamos por aquí mismo.

function getDeveloperDataDestructuring( { name, languages: { python, java, php, perl, javascript } } ){
  console.log('Hola, ' + name);
  console.log('Usted sabe python ? ' + (python || ";-)"));
  console.log('Usted sabe java ? ' + (java || ";-)"));
  console.log('Usted sabe php ? ' + (php || ";-)"));
  console.log('Usted sabe perl ? ' + (perl || ";-)"));
  console.log('Usted sabe javascript ? ' + (javascript || ";-)"));
}
getDeveloperDataDestructuring(developer);
//Hola, María
//Usted sabe python ? yes
//Usted sabe java ? yes
//Usted sabe php ? yes
//Usted sabe perl ? not
//Usted sabe javascript ? yes

Como se puede ver el código es más legible y tiene menos código. Lo único que hemos hecho aquí es pasar a la función una expresión llamada destructuring assignment para la cual solo queremos obtener los datos del objeto developer tales como name y los languages tales como python, java, php, perl y javascript de esta forma:

// Pasados a la función para hacer destructuring.
{ name, languages: { python, java, php, perl, javascript } }

Destructuring de Object en JavaScript ES6

Bien, ya hemos visto mucha funcionalidad de esta nueva característica de ES6. Ahora vemos cómo se destructura un objeto en javascript.

// Destructurando el objeto developer
const { name, languages: { python, java } } = developer;
console.log( `${name} ¿sabe python? ${python}` );
// "María ¿sabe python? yes"

Aquí hay que tener un especial cuidado si declaramos las variables en el ámbito global, que en nuestro caso puede ser windows si usamos un navegador para ejecutar nuestro javascript. Así que podemos tener algo como esto:

// Ámbito global
const developer = {
  name: "María",
  age: 26,
  country: "España",
  languages: {
    python: "yes",
    java: "yes",
    php: "yes",
    perl: "not",
    javascript: "yes"
  }
}
// Ámbito global
let name = 'Diana';     // Redefinimos variable OJO
let age = 55;           // Redefinimos OJO
let country = "Inglaterra"; // Redefinimos OJO
let languages = {      // Redefinimos OJO
  python: "not",
  java: "yes"
}
console.log(`${name} de ${age} edad, vive en ${country} y ¿sabe python? ${languages.python}`);
// "Diana de 55 edad, vive en Inglaterra y ¿sabe python? not"

Y si intentas hacer esto, destructurar el objeto ‘developer‘ recibes un bonito error de tipo Uncaught SyntaxError: Identifier ‘name’ has already been declared

// Ámbito global
let name = 'Diana';
let age = 55;
let country = "Inglaterra";
let languages = {
  python: "not",
  java: "yes"
}
// OJO aqui. Error 'Uncaught SyntaxError: Identifier 'name' has already been declared'
const {name, age, country } = developer; // Object before 'developer'
console.log(`${name} de ${age} edad, vive en ${country} y ¿sabe python? ${languages.python}`);

¿Qué? Esto no es lo qué yo quiero que suceda ¡Pues vamos a solucionarlo!

Para poder solucionar esto lo mejor es crear una función que nos retorne el objeto destructurado o haga esta función de desectructurar el objeto que le pasemos.

// Solución a los objetos con muchos niveles de profundidad
function getDataWithScope( {name, age, country, languages: { python, java } } ) {
  console.log(`${name} de ${age} edad, vive en ${country} y ¿sabe python? ${python}`);
}
getDataWithScope(developer);
// "María de 26 edad, vive en España y ¿sabe python? yes"
//

Alias en destructuring assignment

Si, también se puede poner alias a los nombres de las variables, aunque esta forma o práctica no se usa mucho y ¿cómo puedo hacerlo? pues vamos a verlo.

// Alias con destructuring assignment 
function getDataAlias( {name: nombre, age: edad, country: pais, languages: {python, java}}){
  console.log(`${nombre} de ${edad} edad, vive en ${pais} y ¿sabe python? ${python}`);
}
getDataAlias(developer);
// "María de 26 edad, vive en España y ¿sabe python? yes"
//

Valores por defecto en destructuring assignment

// Valores por defecto en destructuring assignment
function getDataDefault( {
  name, age, country, addClass = 'MiClase', languages: {
    python = 'Not :-(', java
  }
}) {
  console.log(name, age, `vive en ${country} y ¿sabe python?`, python, `,ha añadido una clase ${addClass}`);
}
getDataDefault(developer);
// María 26 vive en España y ¿sabe python? yes ,ha añadido una clase MiClase
//

Destructuring de Arrays en JavaScript ES6

Bien, tal como se ha comentado los Arrays también se pueden extraer sus datos con esta funcionalidad de ES6.

Veamos unos ejemplos:

// Arrays Destructuring
const personName = ["Maria", 46, "Pedro", 50, "Diana", 29];
const [ friend1, age1, friend2, age2, friend3, age3 ] = personName;
console.log(`${friend1}, tiene ${age1} \n ${friend2}, tiene ${age2} \n ${friend3}, tiene ${age3} \n`);
// Maria, tiene 46 
// Pedro, tiene 50 
// Diana, tiene 29 
//

Destructuring de Arrays internos

// Array nested 
const boxData = ["first", [33, 44, 55, 66], 34, "between", 45, 56, 77, 21 ];
const [ first, [num1, num2, num3, num4] ] = boxData;
// Use nested destructuring
console.log(first, num1, num2, num3, num4);
// first 33 44 55 66
//

También podemos hacer uso de Rest operator (…) para obtener algunos elementos o parte de un array:

// Use of Rest operatos
const colors = ['white', 'orange', 'yellow', 'green', 'blue', 'purple', 'teal', 'turquoise'];
const [white, orange, ...otherColors] = colors;
console.log(otherColors);
// ["yellow", "green", "blue", "purple", "teal", "turquoise"]
//

También podemos hacer uso de Spread operator (…) para por ejemplo clonar un array o los valores de este en otro array:

// Spread for copy element of array
const colors = ['white', 'orange', 'yellow', 'green', 'blue', 'purple', 'teal', 'turquoise'];
const colorsCopy = [
  ...colors
];
console.log(colors === colorsCopy); // false
console.log(colorsCopy);
// ["white", "orange", "yellow", "green", "blue", "purple", "teal", "turquoise"]
//

Como nota final tenemos que tener en cuenta que cuando hacemos destructuring de arrays

  • Los datos devueltos tienen un orden de salida, primero el valor del dato [0]
  • No se pueden usar alias.
  • Se pueden usar Rest operator y Spread operatos para facilitar su manejo.

Conclusión:

En este tutorial hemos visto algunos ejemplos de la nueva funcionalidad de ES6 Destructuring Assignment y su sintaxis para el uso con objetos y arrays. Puede que ya sepas manejar todas estas características, espero que aun así hayas aprendido algo. Esta funcionalidad que nos da la nueva versión de JavaScript ES6 nos hace la vida más fácil en el desarrollo JavaScript el cual está dando un salto de gigante dentro del ecosistema de lenguajes que se usan en FrontEnd como en BackEnd.

  • Acerca de
  • Últimas entradas
Francisco Payán
Francisco Payán
Desarrollador Backend, Frontend y Mobile. Autodidacta apasionado del código fuente. Mis metas son aprender y desarrollar código en el día a día. Me gusta la música, el deporte al aire libre y tener amigos/as.
Francisco Payán
Últimas entradas de Francisco Payán (ver todo)
  • Aprende de forma fácil qué es ASYNC y AWAIT en JavaScript ES6 - abril 14, 2019
  • Manejar o atrapar las excepciones en java de forma sencilla - abril 4, 2019
  • Todo sobre Destructuring Assignment en JavaScript ES6 - marzo 29, 2019

© 2025