Intenté esto en la consola de herramientas de desarrollo de Chrome:
let a = [[null,null],[null,null]] function na(){ return Array(2).fill(Array(2)) } let b = na(); console.log(JSON.stringify(a)) // [[null,null],[null,null]] console.log(JSON.stringify(b)) // [[null,null],[null,null]]Hasta aquí todo bien. Esperaba tanto a como a b con los mismos valores y estructura. Luego quise probar una pequeña función que debería agregar un valor adicional en cada línea:
function add(x) { x.map( line => line.push(null) )} add(a) console.log(JSON.stringify(a)) // [[null,null,null],[null,null,null]] add(b) console.log(JSON.stringify(b)) // [[null,null,null,null],[null,null,null,null]] // ?! I was not expecting this extra value here... Bueno, eso fue inesperado. ¿Por qué aparece ese valor nulo adicional en add(b) ?
function na(){ return Array(2).fill(Array(2)) } na() llena el Array(2) vacío con shallow copies del segundo objeto Array(2) .
Como resultado, cambiar los valores en cualquiera de los clones cambia el valor de Array en todas partes.
a = Array(5).fill(Array(3)) a[0][0] = 1 a[0][1] = 2 a[0][2] = 3 console.log(JSON.stringify(a)) Entonces, debido a que b tiene 2 elementos y está usando .push() para agregar un elemento a b para cada una de las (mismas) matrices, se agregan 2 nuevos elementos a la matriz.