为什么数组中的多重赋值会以这种方式发生?

问题描述 投票:1回答:1

我使用这个方法创建一个带有初始化程序的一维数组,当我使用这个方法创建多维数组时,我分配给那个多维数组一个元素,如图所示,我确实得到了该元素到数组的每个元素,这是怎么发生的?

     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)
javascript arrays
1个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.