|
| 1 | +/* |
| 2 | +_____________________________________ |
| 3 | +https://github.com/kenysdev |
| 4 | +2024 - JavaScript |
| 5 | +_______________________________________ |
| 6 | +#05 VALOR Y REFERENCIA |
| 7 | +--------------------------------------- |
| 8 | + * EJERCICIO: |
| 9 | + * - Muestra ejemplos de asignación de variables "por valor" y "por referencia", según |
| 10 | + * su tipo de dato. |
| 11 | + * - Muestra ejemplos de funciones con variables que se les pasan "por valor" y |
| 12 | + * "por referencia", y cómo se comportan en cada caso en el momento de ser modificadas. |
| 13 | + * (Entender estos conceptos es algo esencial en la gran mayoría de lenguajes) |
| 14 | + * |
| 15 | + * DIFICULTAD EXTRA (opcional): |
| 16 | + * Crea dos programas que reciban dos parámetros (cada uno) definidos como variables anteriormente. |
| 17 | + * - Cada programa recibe, en un caso, dos parámetros por valor, y en otro caso, por referencia. |
| 18 | + * Estos parámetros los intercambia entre ellos en su interior, los retorna, y su retorno |
| 19 | + * se asigna a dos variables diferentes a las originales. A continuación, imprime el valor de las |
| 20 | + * variables originales y las nuevas, comprobando que se ha invertido su valor en las segundas. |
| 21 | + * Comprueba también que se ha conservado el valor original en las primeras. |
| 22 | +*/ |
| 23 | + |
| 24 | +// ________________________________________________________ |
| 25 | +// 1. Asignación de variables "por valor": |
| 26 | + |
| 27 | +// Inicialización: |
| 28 | +let int1 = 111; |
| 29 | +let boo1 = false; |
| 30 | +let str1 = "Ben"; |
| 31 | + |
| 32 | +// Asignación: |
| 33 | +let int2 = int1; |
| 34 | +let boo2 = boo1; |
| 35 | +let str2 = str1; |
| 36 | + |
| 37 | +// Cambio: |
| 38 | +int1 = 777; |
| 39 | +boo1 = true; |
| 40 | +str1 = "Bob"; |
| 41 | + |
| 42 | +// Las segundas variables no fueron afectadas. |
| 43 | +console.log(int2, boo2, str2); // 111 false "Ben" |
| 44 | + |
| 45 | +// Ejemplo en una función: |
| 46 | +function fun_v(en_int, en_boo, en_str) { |
| 47 | + // Cambio: |
| 48 | + en_int = 333; |
| 49 | + en_boo = false; |
| 50 | + en_str = "Ken"; |
| 51 | +} |
| 52 | + |
| 53 | +// Paso por valor |
| 54 | +fun_v(int1, boo1, str1); |
| 55 | + |
| 56 | +// No afectadas por los cambios en la función. |
| 57 | +console.log(int1, boo1, str1); // 777 true "Bob" |
| 58 | + |
| 59 | +// ________________________________________________________ |
| 60 | +// 2. Asignación de variables "por referencia": |
| 61 | + |
| 62 | +// Inicialización: |
| 63 | +let lis1 = [444, true, "Dan"]; |
| 64 | +let set1 = new Set([444, true, "Dan"]); |
| 65 | +let dic1 = { name: "Dan" }; |
| 66 | + |
| 67 | +// Asignación: |
| 68 | +let lis2 = lis1; |
| 69 | +let set2 = set1; |
| 70 | +let dic2 = dic1; |
| 71 | + |
| 72 | +// Cambio: |
| 73 | +lis1.splice(0, 3, 888, false, "Zoe"); |
| 74 | +set1.delete(444); |
| 75 | +set1.delete("Dan"); |
| 76 | +dic1.name = "Zoe"; |
| 77 | + |
| 78 | +// Las variables fueron afectadas por el cambio. |
| 79 | +console.log(lis2); |
| 80 | +console.log([...set2]); |
| 81 | +console.log(dic2); |
| 82 | + |
| 83 | +// Ejemplo en una función: |
| 84 | +function fun_r(en_lis, en_set, en_dic) { |
| 85 | + // Cambio: |
| 86 | + en_lis.splice(0, 3, 333, true, "Jay"); |
| 87 | + en_set.add(333); |
| 88 | + en_set.add("Jay"); |
| 89 | + en_dic.name = "Jay"; |
| 90 | +} |
| 91 | + |
| 92 | +// Paso por referencia |
| 93 | +fun_r(lis2, set2, dic2); |
| 94 | + |
| 95 | +// Fueron afectadas por los cambios en la función. |
| 96 | +console.log(lis2); |
| 97 | +console.log([...set2]); |
| 98 | +console.log(dic2); |
| 99 | + |
| 100 | +// ________________________________________________________ |
| 101 | +// 3. DIFICULTAD EXTRA |
| 102 | + |
| 103 | +let s1 = "Ben"; |
| 104 | +let s2 = "Zoe"; |
| 105 | +let l1 = [12, 21]; |
| 106 | +let l2 = ["Ben", "Zoe"]; |
| 107 | + |
| 108 | +console.log(`Pre-Intercambio:\n${s1} - ${s2}\n${l1} - ${l2}`); |
| 109 | + |
| 110 | +function by_value(str1, str2) { |
| 111 | + let temp = str1; |
| 112 | + str1 = str2; |
| 113 | + str2 = temp; |
| 114 | + return [str1, str2]; |
| 115 | +} |
| 116 | + |
| 117 | +function by_reference(list1, list2) { |
| 118 | + return [list2.slice(), list1.slice()]; |
| 119 | +} |
| 120 | + |
| 121 | +const [new_s1, new_s2] = by_value(s1, s2); |
| 122 | +const [new_l1, new_l2] = by_reference(l1, l2); |
| 123 | + |
| 124 | +console.log(`Originales:\n${s1} - ${s2}\n${l1} - ${l2}`); |
| 125 | +console.log(`Nuevas:\n${new_s1} - ${new_s2}\n${new_l1} - ${new_l2}`); |
0 commit comments