写分页组件时需要一个1到10的页码数组,我顺手写了new Array(10).map((v,i)=>i+1),结果拿到十个空位。这个坑新人几乎都踩过,js生成数组的写法不少,行为差别挺大。

Array.from:最推荐的定长初始化

const a = Array.from({length: 5}, (_, i) => i); // 得到 0 到 4

第一个参数只要有length属性就行,第二个是映射函数。它会把空位当成undefined正常遍历,所以能生成序列。要1开头就写i + 1。这个写法还不会踩共享引用的坑。

fill与扩展运算符

Array(3).fill(0)得到三个0,适合占位。注意fill传对象时三个位置指向同一个引用,改一个全变,得用Array.from({length:3}, () => ({}))。扩展运算符配合keys也能得到0、1、2,写法短,可读性差一点。

循环push与Array.of

  • 循环push:长度动态、逻辑复杂时最直白,V8对push有优化,几千个元素不用担心性能。
  • Array.of:Array.of(7)得到只含7的数组,而new Array(7)得到长度7的空数组,只有一个数字参数时两者完全不同。
  • new Array(n):只建议用来占位,配合fill使用,直接map会跳过空位。

二维数组别用fill

Array(3).fill(Array(3).fill(0))看着像3x3矩阵,实际三行是同一个数组,改matrix[0][0]三行全变。正确写法是Array.from({length:3}, () => Array(3).fill(0))。

记住一条:要初始值就Array.from加映射,要占位就fill基本类型。看到new Array(n).map直接当bug处理,它不报错,只会安静地给你一堆空位。