You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript Greeter类代码bug排查与修正求助

JavaScript Greeter类Bug排查与修复

你已经找到的greet方法内用const声明变量后尝试重赋值的问题是准确的:const声明的常量初始化后不允许重新绑定值,运行时会直接抛出"Assignment to Constant Variable"错误,修复时需要将这两个变量声明改为let。
除此之外代码还有3处影响核心逻辑的bug,具体问题原因如下:

  • 构造函数参数顺序完全写反
    根据需求规则,实例化时第一个入参是问候语、第二个入参是姓名,例如new Greeter("What's up", "Dog")返回结果中,"What's up"是问候语、"Dog"是姓名。但当前构造函数定义的参数顺序为(name, greeting),将第一个入参赋值给this.name、第二个赋值给this.greeting,直接导致参数存储错位:单传问候语时,问候语会被错存到name属性,greeting属性为空,后续默认值逻辑完全失效。
  • 条件判断误将全等写为赋值
    判断问候语是否为空的分支代码为if (greeting = undefined),这里使用了单等号赋值运算符=,而非用于严格相等判断的===。代码执行到这一行时会直接把greeting变量赋值为undefined,导致判断条件永远为真,无论实例化时有没有传入问候语,都会被强制重置为默认值"Hello"。
  • 模板字符串使用了错误的包裹符号
    返回值使用普通双引号"包裹,但JavaScript中支持${变量名}插值语法的模板字符串必须使用反引号`包裹。使用双引号时,插值占位符不会被引擎解析,会直接把${greeting}, ${name}!作为普通字符串文本返回,不会替换成变量的实际值。

修复后可正常运行的完整代码

class Greeter {
  // 修正参数顺序:第一个入参为问候语,第二个为姓名
  constructor(greeting, name) {
    this.name = name;
    this.greeting = greeting;
  }
    
  greet() {
    // 将const改为let,允许后续设置默认值时重新赋值
    let name = this.name;
    let greeting = this.greeting;
    
    if (!name) {
      name = "Anonymous";
    }
    // 将赋值运算符=改为严格相等判断===
    if (greeting === undefined) {
      greeting = "Hello";
    }
    
    // 将双引号改为反引号,启用模板字符串插值
    return `${greeting}, ${name}!`;
  }
}

// 测试用例运行结果
// new Greeter().greet() => "Hello, Anonymous!"
// new Greeter("What's up", "Dog").greet() => "What's up, Dog!"
// new Greeter("Hola").greet() => "Hola, Anonymous!"

内容的提问来源于stack exchange,提问作者al feratovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:00:24