JavaScript 一行生成 `[0, 1, ..., N-1]` 序列:jstips 第 33 期的三种方案与原理剖析
教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载本篇指南围绕 jstips 仓库中的第 33 期技巧_posts/en/javascript/2016-02-02-create-range-0-n-easily-using-one-line.md展开系统讲解如何用一行代码生成[0, 1, ..., N-1]这类连续整数数组覆盖 ES5 与 ES6 共三种实现并逐一拆解其底层调用链。读完本文你将掌握「生成连续整数序列」这一高频工具函数的三种写法、它们各自的适用环境与边界条件并能结合实际场景分页、轮播、测试数据、占位渲染直接落地使用。场景为什么需要生成 0 到 N-1 的数组在很多业务与工具代码中我们都需要一个从 0 开始的连续整数数组渲染 N 个占位元素如骨架屏、网格占位生成分页页码或图表刻度批量构造测试数据作为循环次数的载体配合forEach/map实现执行 N 次的语义。直接手写[0, 1, 2, ..., N-1]显然不现实于是就有了各种一行生成 range的技巧。本期的原始文档给出了三种紧凑写法前两种还附带了逐步推导说明下面逐一展开。方案一ES5Array.apply(null, {length: N}).map(Function.call, Number)Array.apply(null, {length: N}).map(Function.call, Number);这是三种方案中唯一不依赖 ES6 的写法在只支持 ES5 的老环境中依然可用。原文档给出了它的四步拆解Array.apply(null, {length: N})返回一个由undefined填充的长度为N的数组即A [undefined, undefined, ...]。A.map(Function.call, Number)返回一个长度为N的数组索引I处的元素为Function.call.call(Number, undefined, I, A)的结果。Function.call.call(Number, undefined, I, A)可折叠为Number(I)其值自然就是I。最终结果为[0, 1, ..., N-1]。为什么第一步能拿到被填充的数组关键在于Array构造函数与Function.prototype.apply的组合直接new Array(N)得到的是稀疏数组sparse array只有长度没有实际元素遍历时元素表现为空洞hole详见同一仓库的_posts/en/javascript/2017-03-12-3-array-hacks.md第 64 期中对稀疏数组的描述apply的第二个参数接受类数组对象array-like它读取该对象的length属性并把下标0到length-1的属性逐一作为实参传给Array。这里传入的{length: N}没有任何下标属性因此等价于调用Array(undefined, undefined, ..., undefined)共 N 个参数结果是 N 个undefined组成的密实数组。同样的手法在本仓库_posts/en/javascript/2016-01-08-converting-a-node-list-to-an-array.md第 08 期中出现过const nodelistToArray Array.apply(null, nodelist);把querySelectorAll返回的类数组 NodeList 一次性转成真正的数组。两者共享同一底层机制可以对照阅读。第二步map(Function.call, Number)的调用链Array.prototype.map的第二个参数是thisArg会把Function.call作为回调、Number作为this传入。map内部对索引I的调用等价于Function.call.call(Number, undefined, I, A)逐层展开外层Function.call.call(Number, ...)表示以Number为this调用Function.prototype.call即Number.call(undefined, I, A)Number.call(undefined, I, A)实际上以undefined为this调用Number(I, A)忽略多余的参数后得到Number(I)即把索引I显式转换为数字结果就是I本身。于是每个索引位置都被替换为其下标最终得到[0, 1, ..., N-1]。这一写法巧妙之处在于复用map的thisArg参数让转换函数 转换上下文两个参数各司其职无需额外声明回调函数。方案二ES6Array.from(new Array(N), (val, index) index)Array.from(new Array(N), (val,index)index);Array.from是 ES6 提供的静态方法第一个参数接收可迭代对象或类数组对象第二个可选参数是映射函数mapFn相当于先收集、再映射的一站式操作。原文档的推导如下A new Array(N)返回一个有 N 个洞的数组即A [,,,...]但对0...N-1范围内的xA[x]取值为undefined。F (val,index)index等价于function F (val, index) { return index; }。Array.from(A, F)返回一个长度为 N 的数组索引I处的元素是F(A[I], I)的结果也就是I。最终结果为[0, 1, ..., N-1]。值得强调的是Array.from与map对稀疏数组的处理不同。map会跳过空洞稀疏数组上直接map会保留空洞这一点在第 64 期的遍历空数组一节中有直观演示new Array(4).map((elem, index) index)得到的仍是[undefined, undefined, undefined, undefined]而Array.from会把空洞当作undefined逐项访问因此映射函数能对每一个下标都执行一次这正是方案二可行性的关键。若对Array.from配合Set去重的用法感兴趣可参考_posts/en/javascript/2016-02-06-deduplicate-an-array.md第 37 期中的Array.from(new Set(...))写法。方案三ES6Array.from(Array(N).keys())Array.from(Array(N).keys());这是三种方案中代码最短、语义最直观的一个Array(N)生成稀疏数组.keys()返回一个遍历其索引0到N-1的迭代器Array.from再把迭代器整体收集为真正的数组。整个过程没有映射回调属于纯取索引语义。三种方案对比方案一行代码环境要求核心机制可读性方案一Array.apply(null, {length: N}).map(Function.call, Number)ES5 及以上apply 展开类数组 map 的thisArg复用较低依赖对Function.call调用链的理解方案二Array.from(new Array(N), (val,index)index)ES6 及以上Array.from的映射函数会访问空洞中方案三Array.from(Array(N).keys())ES6 及以上索引迭代器 Array.from收集高选择建议在只兼容 ES5 的老环境中用方案一现代浏览器与 Node.js 环境原生支持 ES6优先使用方案三代码最短、意图最清晰需要收集同时转换时方案二最顺手。扩展生成[1, 2, ..., N]序列原文档 One More Thing 部分如果实际需要的是从 1 开始的序列原文档给出了两处改写这里完整保留方案一改写ES5Array.apply(null, {length: N}).map(function(value, index){ return index 1; });方案二改写ES6Array.from(new Array(N),(val,index)index1);注意方案一改写后不再依赖Number的隐式转换而是显式声明了function(value, index)并返回index 1可读性反而更好。方案三同理可改写为Array.from(Array(N).keys(), i i 1)映射函数用法见方案二原文档未列出此改法这里作为补充。实战注意事项与边界条件N 必须是有效的非负整数N 0时三式都返回空数组[]N为负数或非整数时行为取决于具体引擎建议在使用前对入参做Number.isInteger(N) N 0之类的校验或封装成range(N)工具函数统一入口。大 N 的内存开销三者最终都会物化为一个长度为 N 的真实数组N 过大时如百万级应评估内存占用必要时改用迭代器方案Array(N).keys()本身是惰性的配合for...of可避免一次性物化。undefined 与空洞的区别Array.apply(null, {length: N})生成的是填满undefined的密实数组而new Array(N)生成的是含空洞的稀疏数组。在map、forEach等会跳过空洞的方法上二者行为截然不同这是方案一能配合map而直接new Array(N).map(...)不行的根因。ES5/ES6 环境判定若需兼容 IE 等旧浏览器且无法引入 polyfill只能使用方案一Array.from、.keys()、箭头函数均属 ES6 特性需要运行环境原生支持或引入对应 polyfill。在仓库中的定位与延伸阅读本期技巧编号为 33在仓库 README.md 的技巧列表中对应 Create Range 0...N easily using one line 条目。该仓库还提供了同一技巧的多语言版本可对照阅读简体中文版、繁体中文版、西班牙语版。与本主题强相关的相邻技巧包括第 08 期Converting a Node List to an ArrayArray.apply处理类数组对象的另一个实战案例第 64 期3 Array Hacks演示稀疏数组上map的失效行为并给出Array.apply(null, new Array(4))的修复写法与方案一的原理互为印证第 37 期Deduplicate an ArrayArray.from(new Set(...))的去重用法展示Array.from的另一典型场景。总结生成[0, 1, ..., N-1]这类连续序列虽然只有一行代码背后却涉及稀疏数组、apply的类数组展开、map的thisArg、Function.call调用链、Array.from的映射语义与索引迭代器等一串 JavaScript 核心机制。根据运行环境选择方案一ES5或方案二/三ES6再按需改写为[1, 2, ..., N]即可在任何项目中快速落地一个可靠的range工具。赞分享教程【免费下载链接】jstipsThis is about useful JS tips!项目地址https://gitcode.com/gh_mirrors/js/jstips点击查看免费下载相关推荐jstips 第 33 期仅用一行代码生成 [0, 1, ..., N-1] 数列jstips 第 33 期仅用一行代码生成 0, 1, ..., N 1 数列 本文源自 jstips 仓库 README.md https://link.教程jstips 实战一行代码生成 [0, 1, ..., N-1] 数组序列的三种写法与原理剖析jstips 实战一行代码生成 0, 1, ..., N 1 数组序列的三种写法与原理剖析 在 JavaScript 开发中生成 0, 1, 2, ...,教程jstips 第 38 期JavaScript 多维数组扁平化的五种方案与深度原理解析jstips 第 38 期JavaScript 多维数组扁平化的五种方案与深度原理解析 导读数组扁平化Flattening是把多维嵌套数组合并成一维数组教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

3.数制和编码知识点总结

3.数制和编码知识点总结

C 数制和编码知识点总结 一、数制和编码1(二进制与编码) 1. 二进制基础 计算机中存储的数据都是二进制形式(0和1)C中二进制表示:以 0b 或 0B 开头,如 0b1010二进制的计数规则:逢二进一&#xff…

2026/10/12 16:44:23 阅读更多 →
前端工程规范落地周报:用机器可执行的门禁守住代码质量红线

前端工程规范落地周报:用机器可执行的门禁守住代码质量红线

几乎每一个前端团队都经历过这样尴尬的局面:技术专家花了几周时间精心编写了一份长达几十页的《前端架构与代码开发规范》,在团队周会上组织全员宣贯,大家一致鼓掌通过并庄重归档到团队 Wiki 知识库中。然而仅仅一个月后去看代码仓库&#xf…

2026/10/9 16:41:24 阅读更多 →
Go 1.27.1 零拷贝在 LLM 网关中的极限压榨:环形缓冲区与内存池实践

Go 1.27.1 零拷贝在 LLM 网关中的极限压榨:环形缓冲区与内存池实践

在大模型推理场景下,网关的角色与传统 RPC 网关截然不同。面对每秒数万并发的 SSE(Server-Sent Events)流式长连接,传统网关采用的 io.Copy 或通用反向代理往往成为性能瓶颈。模型生成的文本是以小分片(Chunk&#xff…

2026/10/12 9:15:46 阅读更多 →

最新新闻

2026年亲测AI论文平台榜单(合规高效版):把Base URL改到TaoToken的实测记录

2026年亲测AI论文平台榜单(合规高效版):把Base URL改到TaoToken的实测记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 19:48:04 阅读更多 →
AI原生全栈开发训练营:从写代码到编排AI的实战指南

AI原生全栈开发训练营:从写代码到编排AI的实战指南

最近总有人问我:AI时代还要不要学全栈开发?我的回答很直接——要学,但不能再用原来那套学法。我自己做了好几年传统前后端,后来把AI能力嵌进产品,也在带一个叫“AI原生超级全栈开发工程师训练营”的项目。这个训练营的…

2026/10/12 19:48:04 阅读更多 →
企业级AI编程软件必看:2026最新8款权威工具深度推荐与TaoToken统一接入实践

企业级AI编程软件必看:2026最新8款权威工具深度推荐与TaoToken统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 19:48:04 阅读更多 →
小白也能轻松玩转龙虾:虾壳云一键部署 OpenClaw 桌面快速安装与 TaoToken 通道配置

小白也能轻松玩转龙虾:虾壳云一键部署 OpenClaw 桌面快速安装与 TaoToken 通道配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 19:48:04 阅读更多 →
【异常】解决 Windows PowerShell 无法识别 ‘claude‘ 命令的实战指南:把 PATH 改到 TaoToken 的排查路径

【异常】解决 Windows PowerShell 无法识别 ‘claude‘ 命令的实战指南:把 PATH 改到 TaoToken 的排查路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 19:48:03 阅读更多 →
电商商品分类库实战:从类目映射到数据清洗的完整指南

电商商品分类库实战:从类目映射到数据清洗的完整指南

简介:这份商品分类库面向电商平台搭建者、零售运营人员及ERP/CRM系统开发者,提供一套可直接落地的货品分类数据方案,解决新建商城或系统升级时分类体系从零构建耗时费力的问题。资源包共1个文件,为SQL脚本类型,压缩包约…

2026/10/12 19:47:03 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →