JavaScript中如何实现数组索引从1而非0开始计数
JavaScript 数组1起始索引实现方案
JavaScript 原生数组没有提供修改索引起始值的配置,默认索引固定从0开始,不存在原生方法可以直接把数组改成从1开始计数。要实现arr[1]取第一个元素的效果,通过逻辑偏移处理即可,不需要修改数组底层实现。
现有代码按0返回undefined的原因
你写的逻辑存在两个问题:
- 按键
0触发时,event.key拿到的是字符串值"0",执行"0" - 1运算会得到数字-1,数组不存在-1下标,自然返回undefined - 现有判断只校验了下标是否小于数组长度,没有过滤小于0的非法下标,导致计算出的无效下标进入了取值逻辑
推荐实现方式
序号偏移法(无副作用,优先使用)
访问数组时统一对输入的序号做减1偏移,同时做好边界校验,从根源避免非法下标问题,修正后的代码如下:
document.addEventListener('keydown', function(event){ const dataClasses = ["toyota", "mazda", "suzuki"]; const inputNum = Number(event.key); const arrayLength = dataClasses.length; console.log(event.key); if(!Number.isNaN(inputNum) && inputNum >= 1 && inputNum <= arrayLength) { const label = dataClasses[inputNum - 1]; console.log(label) } });
该逻辑下按下数字1返回toyota、2返回mazda、3返回suzuki,按下0或者大于3的数字键不会触发无效取值,完全符合预期。
占位元素法(不推荐,易产生bug)
如果要省去每次减1的步骤,可以在数组初始化时在第0位插入一个无意义的占位值,让有效元素自然从下标1开始排列:
const cars = [null, "toyota", "mazda", "suzuki"]; console.log(cars[1]); // 直接输出toyota
注意:这种写法会让数组的length属性比实际有效元素数多1,后续遍历、做长度判断时都需要额外处理第0位的占位值,很容易引入逻辑错误,非特殊场景不建议使用。
内容的提问来源于stack exchange,提问作者Henry Lazada
相关产品推荐
相关产品推荐

