代码之家  ›  专栏  ›  技术社区  ›  João Otero

我在这个Javascript数组行为中遗漏了什么?[副本]

  •  1
  • João Otero  · 技术社区  · 2 年前

    我在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]]
    

    到目前为止,一切顺利。我都期待着 b 具有相同的值和结构。然后我想测试一个小函数,它应该在每一行中附加一个额外的值:

    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...
    

    这真是出乎意料。 为什么是额外的 无效的 出现在 add(b) ?

    1 回复  |  直到 2 年前
        1
  •  0
  •   lejlun Jason    2 年前
    function na(){
        return Array(2).fill(Array(2))
    }
    

    na() 填补空白 Array(2) 具有 shallow copies 第二个的 阵列(2) 对象

    因此,更改任何克隆中的值都会更改阵列在任何位置的值。

    a = Array(5).fill(Array(3))
    
    a[0][0] = 1
    a[0][1] = 2
    a[0][2] = 3
    
    console.log(JSON.stringify(a))

    所以因为 b 有2个元素,您正在使用 .push() 将元素添加到 b 对于每个(相同)数组,将向数组中添加2个新元素。