不使用toString(16)实现RGB转Hex的JavaScript函数运行异常排查
问题答复
你的故障原因不是多个switch语句导致循环未完成第二个switch逻辑就结束迭代——实际上switch块里的break仅会跳出当前switch结构,不会终止外层for循环,你的代码里两个switch都会完整执行,输出错误来自三个核心逻辑问题:
- 边界判断后缺少流程控制:当判断颜色值大于255拼接
FF、小于0拼接00后,没有跳过当前循环后续的转换逻辑,后续两个switch语句会继续执行拼接多余字符,最终输出长度远超6位。 - 第二个十六进制位(低4位)计算公式错误:十六进制每两位对应0-255的取值,高4位是除以16取整,低4位正确计算方式是对16取余即
arr[i] % 16,你写的((arr[i]/16)-16)*16计算结果完全不符合预期,无法匹配到正确的字母分支。 - 边界值未做钳位归一化:判断超范围后没有把输入值修正到0-255的合法区间,且两个边界判断为独立if语句,没有做逻辑互斥,遇到非法值时计算逻辑会完全失控。
修正后可运行代码
function rgb(r, g, b){ let result = ''; // 值钳位:将所有输入规范到0-255的合法区间 const clamp = (val) => Math.max(0, Math.min(255, val)); let arr = [r,g,b].map(clamp); // 复用逻辑:单个0-255十进制值转两位十六进制字符 const toHex = (num) => { const highBit = Math.floor(num / 16); const lowBit = num % 16; const convertBit = (val) => { switch(val) { case 10: return 'A'; case 11: return 'B'; case 12: return 'C'; case 13: return 'D'; case 14: return 'E'; case 15: return 'F'; default: return String(val); } } return convertBit(highBit) + convertBit(lowBit); } for(let i = 0; i < arr.length; i++) { result += toHex(arr[i]); } return result; } // 测试用例结果符合预期 rgb(255, 255, 255) // 返回FFFFFF rgb(255, 255, 300) // 返回FFFFFF rgb(0,0,0) // 返回000000 rgb(148, 0, 211) // 返回9400D3
内容的提问来源于stack exchange,提问作者Oscar Sanchez
相关产品推荐
相关产品推荐

