JavaScript四边形检测代码优化求助:精简、可读及错误排查
四边形检测代码优化方案
优化后的代码
// 通用输入函数:获取指定数量的有效数值输入 const getNumericInputs = (count, label) => { const inputs = []; for (let i = 1; i <= count; i++) { let input; // 循环直到输入有效正数 do { input = prompt(`请输入${label} ${i}的数值:`); // 处理用户取消输入的情况 if (input === null) return null; input = Number(input); } while (isNaN(input) || input <= 0); inputs.push(input); } return inputs; }; alert("这是一个四边形检测程序,请依次输入四条边的长度和四个内角的度数。"); // 获取边和角的输入 const sides = getNumericInputs(4, "边长"); const angles = getNumericInputs(4, "内角"); // 处理用户取消输入的情况 if (!sides || !angles) { console.log("检测已取消"); alert("检测已取消"); } else { // 验证四边形内角和是否为360度(允许微小精度误差) const angleSum = angles.reduce((sum, angle) => sum + angle, 0); if (Math.abs(angleSum - 360) > 0.1) { console.log("输入的内角和不为360度,无法构成四边形"); alert("输入的内角和不为360度,无法构成四边形"); } else { const [s1, s2, s3, s4] = sides; const [a1, a2, a3, a4] = angles; // 判断是否为平行四边形:对边相等且对角相等 const isParallelogram = s1 === s3 && s2 === s4 && a1 === a3 && a2 === a4; if (isParallelogram) { const allSidesEqual = s1 === s2 && s2 === s3; const allAnglesRight = a1 === 90 && a2 === 90; if (allSidesEqual && allAnglesRight) { console.log("这是正方形"); } else if (allAnglesRight) { console.log("这是矩形"); } else if (allSidesEqual) { console.log("这是菱形"); } else { console.log("这是平行四边形"); } } else { console.log("该图形不是正方形、矩形、菱形或平行四边形"); } } }
关键改进说明
1. 封装重复输入逻辑
原代码中获取边和角的输入逻辑完全重复,通过封装getNumericInputs函数,减少冗余代码,同时统一处理输入验证逻辑。
2. 增加输入有效性验证
- 确保输入是有效的正数(排除NaN、负数、零)
- 处理用户点击取消输入的情况
- 验证四边形内角和是否为360度(考虑浮点精度,允许0.1的误差),原代码完全忽略这个基本几何规则,可能导致错误判断。
3. 重构条件判断逻辑
原代码条件判断冗余且层级混乱:
- 先判断是否为平行四边形(这是其他三种图形的基础),再在平行四边形的前提下判断正方形、矩形、菱形,逻辑更清晰
- 用语义化变量(如
allSidesEqual、allAnglesRight)替代冗长的条件表达式,简化判断 - 修复原代码逻辑错误:原代码判断菱形/平行四边形时仅限定特定角的大小(如a1<90),实际上只要对角相等即可,角度大小的组合不影响类型判断,原代码会误判部分合法情况。
4. 提升代码可读性
- 使用数组存储边和角,通过解构赋值简化变量调用
- 代码结构分层,每个逻辑块负责单一功能
- 移除无意义变量:原代码中
start = alert(...)无实际作用,直接删除
内容的提问来源于stack exchange,提问作者saf
相关产品推荐
相关产品推荐

