JavaScript中如何遍历数字类型变量的每一位数值?
遍历数字每一位的实现方法
现有代码的问题
当前代码存在一处循环边界错误:
- 字符串的字符索引从0开始,长度为
n的字符串有效索引范围是0 ~ n-1,你设置的循环终止条件i <= str.length,会在i等于字符串长度时访问到不存在的字符,经过+运算符隐式转值后会得到NaN,最终结果数组最后一位是无效值。
基础修正版本
将循环边界调整为i < str.length即可正常运行:
const numbers = 1234567654321; const str = numbers.toString(); let results = []; for (let i = 0; i < str.length; i++) { results.push(+str[i]); } console.log(results); // 输出 [1,2,3,4,5,6,7,6,5,4,3,2,1]
精简写法
基于字符串拆分的思路可以省略手动循环,代码更简洁:
const numbers = 1234567654321; // 数字转字符串后用扩展运算符拆分为单字符数组,通过map映射为数字类型 const results = [...numbers.toString()].map(Number); console.log(results);
纯数学实现(不依赖字符串转换)
如果不想通过类型转换走字符串逻辑,可以通过逐次取余、整除的方式拆分每一位,适合对类型转换有严格限制的场景:
const getDigits = (num) => { // 单独处理数字为0的边界情况 if (num === 0) return [0]; const digits = []; // 兼容负数场景,先取绝对值消除符号影响 let current = Math.abs(num); // 从最低位开始逐位提取 while (current > 0) { digits.push(current % 10); current = Math.floor(current / 10); } // 提取顺序为从低位到高位,反转后得到正序的位数数组 return digits.reverse(); }; const numbers = 1234567654321; const results = getDigits(numbers); console.log(results);
注意事项
- 当数字超过JS安全整数范围(
Number.MAX_SAFE_INTEGER)时,数字本身会出现精度丢失,上述两种方法都无法得到正确的位数,这类场景建议直接把大数字定义为字符串类型处理。 - 如果原数字是小数,转字符串的方式会把小数点也识别为字符,需要根据业务逻辑提前过滤非数字字符。
内容的提问来源于stack exchange,提问作者Yurii Parfinenko
相关产品推荐
相关产品推荐

