Estoy estudiando ahora en FreeCodeCamp , y aquí hay un desafío:
"Hemos definido una función, copyMachine, que toma arr (una matriz) y num (un número) como argumentos. Se supone que la función devolverá una nueva matriz formada por num copias de arr. Hemos hecho la mayor parte del trabajo por usted , pero aún no funciona del todo bien. Modifique la función usando la sintaxis extendida para que funcione correctamente (pista: ¡otro método que ya hemos cubierto podría ser útil aquí!)".
Y aquí hay una solución:
function copyMachine(arr, num) { let newArr = []; while (num >= 1) { // Only change code below this line newArr.push([...arr]) // Only change code above this line num--; } return newArr; } console.log(copyMachine([true, false, true], 2)); ¿Qué sentido tiene agregar corchetes y puntos adicionales (...) si pudiera agregar newArr.push(arr) en su lugar y obtener el mismo resultado? El resultado es: [ [ true, false, true ], [ true, false, true ] ]
Es el tema de la referencia.
Al usar esta sintaxis newArr.push(arr) arr está insertando la matriz original del argumento, por lo que siempre que la matriz cambie su contenido, las matrices dentro de newArr también se actualizarán, ya que siempre es la misma matriz.
Cuando usa la sintaxis extendida, en realidad está enviando una copia de ese arr . Esto significa que es una nueva matriz que no está vinculada a la matriz que pasa a una función
Considera esto
function copyMachine(arr, num) { let newArr = []; while (num >= 1) { // Only change code below this line newArr.push(arr) // Only change code above this line num--; } return newArr; } const oldArr = [true, false, true]; const newArr = copyMachine(oldArr, 2); oldArr.push(true); console.log(newArr); // contains an element added to the old arrayLa sintaxis extendida (...) permite que un iterable, como una expresión de matriz o una cadena, se expanda en lugares donde se esperan cero o más argumentos (para llamadas a funciones) o elementos (para literales de matriz), o se expande una expresión de objeto en lugares donde se esperan cero o más pares clave-valor (para objetos literales).
En el código provisto, el operador de propagación se usa para crear una nueva matriz usando los elementos de la matriz llamada arr y luego insertarla en newArr .
Esto es similar a hacer newArr.push(arr);