控制流实验代码报错finalPrice未定义,请求排查修正
问题
我正在进行一项控制流实验,编写包裹运费计算代码时无法正常运行,持续报错‘finalPrice is not defined’,我认为遗漏了一些简单细节。
实验要求
编写代码实现以下包裹定价规则:
- 包裹重量小于3lbs时,运费为5美元;否则按每磅1.79美元计费。
- 若寄件人拥有Brooklyn Shipping Solutions会员资格,重量小于10lbs的包裹享10%折扣,其他包裹享12%折扣。
- 无论是否为会员,节假日配送需额外增加5美元。
计算完成后需通过console.log()打印包含寄件人姓名、最终价格、包裹描述的收据;若packageDescription或packageSender为空,需打印‘A package description and sender is required!’。
我的代码
// Leave these values the same throughout. const minimumPriceInCents = 500; const priceInCentsPerPound = 179; // Change the values of these variables to test out your code. const packageDescription = 'Box'; const packageSender = 'Jimmy'; const packageWeightInPounds = 2; const hasMembership = false; const isHolidayDelivery = false; // Write your algorithm below! let shippingCost = (packageWeightInPounds * priceInCentsPerPound) / 100; let minimumPriceInDollars = minimumPriceInCents / 100; let finalPrice = 0; if ( isHolidayDelivery === true && hasMembership === true && packageWeightInPounds < 3 ) { let finalPrice = (minimumPriceInDollars * 0.9 + 5); console.log(`${packageSender} - $${finaPrice}`); console.log(`Package Description: ${packageDescription}`); } else if ( isHolidayDelivery === true && hasMembership === true && packageWeightInPounds >= 10 ) { finalPrice = (minimumPriceInDollars * 0.88 + 5); console.log(`${packageSender} - $${finaPrice}`); console.log(`Package Description: ${packageDescription}`); } else if ( isHolidayDelivery === false && hasMembership === true && packageWeightInPounds >= 10 ) { finalPrice = (minimumPriceInDollars * 0.88); console.log(`${packageSender} - $${finaPrice}`); console.log(`Package Description: ${packageDescription}`); } if ( isHolidayDelivery === false && hasMembership === true && packageWeightInPounds < 3 ) { finalPrice = (minimumPriceInDollars * 0.9); console.log(`${packageSender} - $${finaPrice}`); console.log(`Package Description: ${packageDescription}`); } else if ( isHolidayDelivery === false && hasMembership === false && packageWeightInPounds < 3 ) { finalPrice = (minimumPriceInDollars); console.log(`${packageSender} - $${finaPrice}`); console.log(`Package Description: ${packageDescription}`); } else if ( isHolidayDelivery === true && hasMembership === false && packageWeightInPounds < 3 ) { finalPrice = (minimumPriceInDollars + 5); console.log(`${packageSender} - $${finaPrice}`); console.log(`Package Description: ${packageDescription}`); } else if (isHolidayDelivery === false && hasMembership === false) { finalPrice = (minimumPriceInDollars); console.log(`${packageSender} - $${finaPrice}`); console.log(`Package Description: ${packageDescription}`); } else console.log('A package description and sender is required!');
问题排查与修复
核心问题分析
- 拼写错误:多处将
finalPrice误写为finaPrice,这是直接触发finalPrice is not defined报错的原因之一。 - 变量重复声明:第一个
if块内使用let finalPrice重新声明局部变量,覆盖了外层的finalPrice,导致该分支内的变量无法被外部逻辑访问。 - 逻辑分支覆盖不全:
- 未处理重量在3-10磅之间的场景(如5磅包裹),原代码会错误触发最后的必填项提示。
- 未优先校验
packageDescription或packageSender为空的情况,逻辑顺序错误。
- 运费计算逻辑错误:定义了
shippingCost但未实际使用,所有场景都固定用5美元基础运费,违反了“重量≥3lbs时按每磅1.79美元计费”的规则。
修复后的代码
// Leave these values the same throughout. const minimumPriceInCents = 500; const priceInCentsPerPound = 179; // Change the values of these variables to test out your code. const packageDescription = 'Box'; const packageSender = 'Jimmy'; const packageWeightInPounds = 2; const hasMembership = false; const isHolidayDelivery = false; // Write your algorithm below! let finalPrice = 0; // Step 1: Validate required fields first if (!packageDescription || !packageSender) { console.log('A package description and sender is required!'); } else { // Step 2: Calculate base shipping cost let baseCost; if (packageWeightInPounds < 3) { baseCost = minimumPriceInCents / 100; } else { baseCost = (packageWeightInPounds * priceInCentsPerPound) / 100; } // Step 3: Apply membership discount if applicable if (hasMembership) { if (packageWeightInPounds < 10) { baseCost *= 0.9; // 10% discount } else { baseCost *= 0.88; // 12% discount } } // Step 4: Add holiday delivery surcharge if (isHolidayDelivery) { baseCost += 5; } // Step 5: Round to 2 decimal places for currency format finalPrice = Math.round(baseCost * 100) / 100; // Step 6: Print receipt console.log(`${packageSender} - $${finalPrice.toFixed(2)}`); console.log(`Package Description: ${packageDescription}`); }
修复说明
- 优先校验必填项:将
packageDescription和packageSender的空值检查放在最前面,符合业务逻辑顺序。 - 模块化计算逻辑:拆分基础运费计算、会员折扣、节假日附加费三个步骤,代码更易读且逻辑清晰。
- 修复拼写与变量问题:删除局部变量重复声明,修正
finaPrice拼写错误。 - 完善场景覆盖:处理了所有重量区间(<3、3-10、≥10)的情况,完全符合实验规则。
- 货币格式化:使用
toFixed(2)确保价格以两位小数的标准货币格式输出。
内容的提问来源于stack exchange,提问作者Mark Robertson
相关产品推荐
相关产品推荐

