This is the same old problem when arrays (and objects in general) are references, not values.
In particular, when you execute arr.fill([]), you take one single empty array and use it to populate the parent.
I like to say:
var arr = new Array(5);
arr[0] = arr[1] = arr[2] = arr[3] = arr[4] = [];
! , , , ( )
, . - :
Array.apply(null, Array(5)).map(function() {return [];});
, () 5 () [].
EDIT: , . @torazaburo, Array.from Array.apply(null, Array(5)).map, :
Array.from( new Array(5), function() { return []; } );