写分页组件时需要一个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处理,它不报错,只会安静地给你一堆空位。