Почему множественное присвоение в массиве здесь происходит таким образом?

#javascript #arrays

#javascript #массивы

Вопрос:

Я использовал этот метод для создания одномерного массива с инициализатором, когда я использовал этот метод для создания многомерных массивов, и я назначаю этому многомерному массиву один элемент, как показано, я получаю этот элемент для каждого элемента массива, как это происходит?

      Array.dim=function(dimensions,init){
     var a=[],i;
     for(i=0;i<dimensions;i  ){
     a[i]=init;
       }
  return a;}   
         var p=Array.dim(20,0);
 p
(20) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

   var p=Array.dim(10,[]);

    p[0][0]=0;

   (10) [Array(1), Array(1), Array(1), Array(1), Array(1), Array(1), Array(1), Array(1), Array(1), Array(1)]
 0: [0]
 1: [0]
 2: [0]
 3: [0]
 4: [0]
 5: [0]
 6: [0]
 7: [0]
 8: [0]
 9: [0]
 length: 10
 __proto__: Array(0)
  

Комментарии:

1. Потому что a[i] всегда указывает на init . Массив заполняется одной и той же ссылкой на пустой массив , следовательно , все элементы массива в p указывают на одну и ту же ссылку на массив , следовательно, каждый элемент показывает одну и ту же ссылку , которая становится [0]. В двух словах, p[0][0] совпадает с point[0][1] и так далее, потому что оба указывают на init .

Ответ №1:

Вы передаете ссылку на массив, и каждый элемент использует одну и ту же ссылку на объект для данного массива.

Вы могли бы использовать функцию, которая возвращает новый массив для каждого вызова.

 Array.dim = function(dimensions, init) {
    var a = [],
        i;
    for (i = 0; i < dimensions; i  ) {
        a[i] = typeof init === 'function' ? init() : init;
    }
    return a;
}

var p = Array.dim(20, 0),
    q = Array.dim(10, () => []);

q[0][0] = 0;

console.log(p);
console.log(q);  

Немного более короткий подход.

 Array.dim = function(length, init) {
    return Array.from({ length }, typeof init === 'function' ? init : () => init);
}

var p = Array.dim(20, 0),
    q = Array.dim(10, () => []);

q[0][0] = 0;
console.log(p);
console.log(q);