zoukankan      html  css  js  c++  java
  • Array.prototype.fill 填充值被复用的问题

    考察如下示例代码:

    // 创建二维数组
    const arr = Array(2).fill([]);
    
    // 操作第一个元素
    arr[0].push(1);
    
    // 结果是操作了所有数组
    console.log(arr); // [ [ 1 ], [ 1 ] ]

    和 new 不 new 关系,以下代码问题同样存在

    - const arr= Array(12).fill([])
    + const arr= new Array(12).fill([])
    
    arr[0].push(1)
    
    console.log(arr); // [ [ 1 ], [ 1 ] ]

    问题出在这个 fill,根据 MDN 的描述

    The fill() method changes all elements in an array to a static value
    MDN Array.prototype.fill()

    arr.fill(value[, start[, end]]) 这里使用 value 替换数组中的元数,当 value 为对象字面量时,这个对象是被共用的,并没有为每个元素重新创建副本。所以当操作其中一个元素时,所有元素都被影响了。本例中,使用 [] 这个数组字面量填充数组,操作其中任意元数导致所有元素变更。

    修正方式则是通过 Array.prototype.map 将每个元素重新赋值,解除这里的复用。

    const arr = Array(2)
    .fill(1)
    .map((item) => []);
    
    arr[0].push(1);
    
    // 结果是操作了所有数组
    console.log(arr); // [ [ 1 ], [] ]

    之所以在 Array(number) 创建好指定长度的空数组后还需要 fill 填充一下,是因为不填充的话,空数组不能被实际操作,即不能 pushmap 等,打印出来如下:

    [ <2 empty items> ]
    

    相关资源

    The text was updated successfully, but these errors were encountered:

    CC BY-NC-SA 署名-非商业性使用-相同方式共享
  • 相关阅读:
    排序算法分析
    Android学习之DragEvent
    Android Studio导出Jar包
    Android中的一些基础知识(三)
    Android中的一些基础知识(一)
    Android中的一些基础知识(二)
    Android学习之Drawable(一)
    Android消息机制之Handler
    Android滑动事件冲突
    Android创建窗口(一)创建应用窗口
  • 原文地址:https://www.cnblogs.com/Wayou/p/14674193.html
Copyright © 2011-2022 走看看