#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);