JavaScript生成数字数组:4种方法搞定0到10

更新日期: 2025-12-03 阅读: 19 标签: 数组

在JavaScript开发中,经常需要生成连续的数字数组。比如要生成0到10的数组,有好几种方法可以实现。今天介绍4种常用的方法,从最简单到最灵活,你可以根据需求选择。


方法一:Array.from(最推荐)

这是现在最常用的方法,一行代码就能搞定:

const arr = Array.from({ length: 11 }, (_, i) => i);
console.log(arr); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

工作原理

  1. { length: 11 } 创建一个类似数组的对象,有11个位置

  2. Array.from() 把这个类数组转成真正的数组

  3. 第二个参数是处理函数,i 是当前位置的索引

  4. 函数返回索引值,就得到了0到10的数字

为什么推荐?

  • 代码简洁,一眼就能看懂

  • 现代JavaScript的标准写法

  • 支持所有现代浏览器

生成其他范围的数组

// 生成 0~20
const arr1 = Array.from({ length: 21 }, (_, i) => i);

// 生成 1~10
const arr2 = Array.from({ length: 10 }, (_, i) => i + 1);

// 生成偶数 0, 2, 4, ..., 10
const arr3 = Array.from({ length: 6 }, (_, i) => i * 2);


方法二:扩展运算符 + keys()

这个方法也很简洁,利用了数组的迭代器:

const arr = [...Array(11).keys()];
console.log(arr); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

逐步解析

  1. Array(11) 创建一个长度11的空数组

  2. .keys() 返回数组索引的迭代器(0到10)

  3. ... 扩展运算符把迭代器转成真正的数组

适用场景

  • 需要生成连续索引时

  • 代码要求极简风格

  • 只需要0开始的序列

限制

  • 只能从0开始

  • 不能直接生成其他起始值的序列


方法三:for循环(最传统)

虽然代码多一点,但最基础最容易理解:

const arr = [];
for (let i = 0; i <= 10; i++) {
    arr.push(i);
}
console.log(arr); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

变体:while循环

const arr = [];
let i = 0;
while (i <= 10) {
    arr.push(i);
    i++;
}

什么时候用for循环?

  1. 初学者学习时:逻辑最清晰

  2. 需要复杂逻辑时:可以在循环里添加条件判断

  3. 性能关键场景:有时比高阶函数略快

  4. 旧项目维护:兼容性最好

生成复杂序列的例子

// 生成平方数数组
const squares = [];
for (let i = 0; i <= 10; i++) {
    squares.push(i * i);
}
// [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

// 跳过某些数字
const filtered = [];
for (let i = 0; i <= 10; i++) {
    if (i % 2 === 0) {  // 只要偶数
        filtered.push(i);
    }
}
// [0, 2, 4, 6, 8, 10]


方法四:封装成通用函数

如果你经常需要生成不同范围的数组,可以封装一个函数:

/**
 * 生成连续数字数组
 * @param {number} start - 起始数字
 * @param {number} end - 结束数字
 * @param {number} step - 步长(默认1)
 * @returns {number[]} 生成的数组
 */
function range(start, end, step = 1) {
    const result = [];
    for (let i = start; i <= end; i += step) {
        result.push(i);
    }
    return result;
}

// 使用例子
const arr1 = range(0, 10);     // [0, 1, 2, ..., 10]
const arr2 = range(1, 10);     // [1, 2, 3, ..., 10]
const arr3 = range(0, 10, 2);  // [0, 2, 4, 6, 8, 10]
const arr4 = range(10, 0, -1); // [10, 9, 8, ..., 0]

更完善的版本

function range(start, end, step = 1) {
    // 参数验证
    if (typeof start !== 'number' || typeof end !== 'number') {
        throw new Error('参数必须是数字');
    }
    
    if (step === 0) {
        throw new Error('步长不能为0');
    }
    
    const result = [];
    
    // 处理递减序列
    if (start > end && step > 0) {
        step = -step;
    }
    
    // 生成数组
    if (step > 0) {
        for (let i = start; i <= end; i += step) {
            result.push(i);
        }
    } else {
        for (let i = start; i >= end; i += step) {
            result.push(i);
        }
    }
    
    return result;
}


性能比较

测试代码

// 测试不同方法的性能
const testSize = 1000000; // 生成100万个数字的数组

console.time('Array.from');
const arr1 = Array.from({ length: testSize }, (_, i) => i);
console.timeEnd('Array.from');

console.time('扩展运算符');
const arr2 = [...Array(testSize).keys()];
console.timeEnd('扩展运算符');

console.time('for循环');
const arr3 = [];
for (let i = 0; i < testSize; i++) {
    arr3.push(i);
}
console.timeEnd('for循环');

console.time('map方法');
const arr4 = Array(testSize).fill(0).map((_, i) => i);
console.timeEnd('map方法');

结果分析(仅供参考):

  • for循环:通常最快,特别是大数据量时

  • Array.from:现代浏览器中表现很好

  • 扩展运算符:简洁但可能稍慢

  • map方法:最慢,不推荐

实际建议:

  • 小数组(<1000个元素):用哪个都行,差别很小

  • 大数组:优先用for循环或Array.from

  • 考虑可读性比微小性能差异更重要


常见需求解决方案

1. 生成1到10的数组

// 方法1
const arr1 = Array.from({ length: 10 }, (_, i) => i + 1);

// 方法2
const arr2 = [...Array(10).keys()].map(i => i + 1);

// 方法3
const arr3 = [];
for (let i = 1; i <= 10; i++) {
    arr3.push(i);
}

2. 生成10到0的递减数组

// 方法1
const arr1 = Array.from({ length: 11 }, (_, i) => 10 - i);

// 方法2
const arr2 = [...Array(11).keys()].map(i => 10 - i);

// 方法3
const arr3 = [];
for (let i = 10; i >= 0; i--) {
    arr3.push(i);
}

3. 生成特定规律的数组

// 生成0到100的偶数
const evens = Array.from({ length: 51 }, (_, i) => i * 2);

// 生成1到10的平方数
const squares = Array.from({ length: 10 }, (_, i) => (i + 1) ** 2);

// 生成斐波那契数列前10项
const fib = [0, 1];
for (let i = 2; i < 10; i++) {
    fib.push(fib[i - 1] + fib[i - 2]);
}


实际应用场景

场景1:分页组件

// 生成页码数组
function generatePageNumbers(currentPage, totalPages) {
    const start = Math.max(1, currentPage - 2);
    const end = Math.min(totalPages, currentPage + 2);
    
    return Array.from(
        { length: end - start + 1 },
        (_, i) => start + i
    );
}

// 假设总共10页,当前在第5页
const pages = generatePageNumbers(5, 10);
// [3, 4, 5, 6, 7]

场景2:数据可视化

// 生成x轴刻度
function generateXAxis(start, end, interval) {
    const length = Math.floor((end - start) / interval) + 1;
    return Array.from({ length }, (_, i) => start + i * interval);
}

// 生成0到100,间隔10的刻度
const ticks = generateXAxis(0, 100, 10);
// [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

场景3:测试数据

// 生成测试用户数据
const testUsers = Array.from({ length: 10 }, (_, i) => ({
    id: i + 1,
    name: `用户${i + 1}`,
    age: Math.floor(Math.random() * 50) + 20,
    email: `user${i + 1}@example.com`
}));


最佳实践建议

1. 根据项目选择

  • 新项目:优先用Array.from,代码简洁

  • 旧项目:保持现有代码风格一致

  • 库/框架开发:考虑兼容性,可以用for循环

2. 代码可读性

给复杂操作加注释:

// 生成0到10的数组,用于遍历操作
const indices = Array.from({ length: 11 }, (_, index) => index);

3. 错误处理

function safeRange(start, end, step = 1) {
    if (typeof start !== 'number' || typeof end !== 'number') {
        console.warn('range函数需要数字参数');
        return [];
    }
    
    if (step === 0) {
        console.warn('步长不能为0');
        return [];
    }
    
    try {
        const length = Math.floor((end - start) / step) + 1;
        return Array.from({ length }, (_, i) => start + i * step);
    } catch (error) {
        console.error('生成数组时出错:', error);
        return [];
    }
}

4. 性能优化

  • 小数组不必过度优化

  • 大数组考虑预分配大小(如果需要用for循环)


总结

生成0到10的数组,有几种常用方法:

  1. 最推荐:Array.from({ length: 11 }, (_, i) => i)

    • 简洁明了

    • 现代JavaScript标准

    • 功能灵活

  2. 简洁选择:[...Array(11).keys()]

    • 代码更短

    • 适合只需要0开始的情况

  3. 基础方法:for循环

    • 最好理解

    • 兼容性最好

    • 适合复杂逻辑

  4. 通用方案:封装range函数

    • 适合频繁使用

    • 功能最完整

    • 便于维护

选择哪种方法,主要看你的具体需求。日常开发中,Array.from基本能满足大部分场景。记住,写代码不仅要能用,还要让别人(包括未来的你)能看懂。选择合适的方法,写出清晰易读的代码最重要。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13279

探索JavaScript数组奥秘

avaScript数组同后端语言一样,具有它自己的数据结构,归根结底,这种数据结构,本质就是一种集合。在后端语言中(如java,.net等),数组是这样定义的:数组是用来存储相同数据类型的集合

js使用数组+循环+条件实现数字转换为汉字的简单方法。

单个数字转汉字的解决方法:利用数组存储0-9的汉字、 ary.length和str.length不用多说,这是指ary数组和str字符串的长度。这里我们需要注意的是str.charAt(j)和ary[i],分别指在str这个字符串中索引为j的元素,在ary中索引为i的元素。

[译]async-await 数组循环的几个坑

在 Javascript 循环中使用 async/ await 循环遍历数组似乎很简单,但是在将两者结合使用时需要注意一些非直观的行为。让我们看看三个不同的例子,看看你应该注意什么,以及哪个循环最适合特定用例。

数组、字符串去重

今天说的数组和字符串去重呢,主要用到es6新的数据结构 Set,它类似于数组,但是成员的值都是唯一的,没有重复的值,所以活用Set来进行数组和字符串的去重。

JavaScript 数组方法

数组方法:1、Array.join([param]) 方法:将数组中所有的元素都转换为字符串并连接起来,通过字符 param 连接,默认使用逗号,返回最后生成的字符串2、Array.reverse() 方法:将数组中的元素颠倒顺序(在原数组中重新排列它们),返回逆序数组

如何删除JavaScript 数组中的虚值

falsy(虚值)是在 Boolean 上下文中已认定可转换为‘假‘的值.JavaScript 在需要用到布尔类型值的上下文中使用强制类型转换(Type Conversion )将值转换为布尔值,比如:在条件语句或者循环语句中。

JavaScript中十种一步拷贝数组的方法

JavaScript中我们经常会遇到拷贝数组的场景,但是都有哪些方式能够来实现呢,我们不妨来梳理一下。扩展运算符(浅拷贝)自从ES6出现以来,这已经成为最流行的方法。

JS数组的几个经典api

本文主要来讲数组api的一些操作,如简单实现扁平化n维数组、数组去重、求数组最大值、数组求和、排序、对象和数组的转化等。扁平化嵌套数组/展平和阵列孔——flat()

关于Vue不能监听(watch)数组变化

vue无法监听数组变化的情况,但是数组在下面两种情况下无法监听:利用索引直接设置数组项时,例如arr[indexofitem]=newValue;修改数组的长度时,例如arr.length=newLength

JS计算两个数组的交集、差集、并集、补集(多种实现方式)

使用 ES5 语法来实现虽然会麻烦些,但兼容性最好,不用考虑浏览器 JavaScript 版本,使用 ES5 语法来实现虽然会麻烦些,但兼容性最好,不用考虑浏览器 JavaScript 版本。也不用引入其他第三方库。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!